2014-09-18 3 views
-2

Я пытаюсь тянуть имя, адрес, номер телефона и адрес электронной почты курортов со страницы (ы)Web Зачистка в Ruby: Проблемы Зачистка данных, который приходит из базы данных

http://www.exploreminnesota.com/places-to-stay/resorts/?keywords=&pageIndex=0&radius=0&mapTab=false&sortOrder=asc&sort=randomdaily&locationid=&startDate=false&class_id=7&lat=&lon=&city=&pageSize=20&type=reitlistings&attrFieldsOr=

I 'm new для Ruby и искали некоторые примеры, но это кажется слишком специфичным, чтобы найти подходящее решение.

Фокусировка на элементе адреса электронной почты. Имея «проверенный элемент» и взяв путь к CSS (# category-listings> li: nth-child (1)> div> div> ul> li: nth-child (2)> a)

Я написал скрипт рубин, чтобы попытаться вытащить эти данные:

require 'nokogiri' 
require 'open-uri' 

PAGE_URL = "http://www.exploreminnesota.com/places-to-stay/resorts/?keywords=&pageIndex=0&radius=0&mapTab=false&sortOrder=asc&sort=randomdaily&locationid=&startDate=false&class_id=7&lat=&lon=&city=&pageSize=20&type=reitlistings&attrFieldsOr=" 

page = Nokogiri::HTML(open(PAGE_URL)) 

site1 = page.css(' #category-listings li:nth-child(1) div div ul li:nth-child(2) a') 
puts site1 

выход:

href="mailto:**%7B%7Br._source.database_fields.email%7D%7D"** class="button gaTracker" title="**{{r._source.database_fields.email}}**" data-tracker-type="event" data-category="Email" data-label="{{r._source.location.split('/')[1]}}" data-action="{{url | analyticsAction}}">Email 

Как вы можете видеть, где я хочу, адрес электронной почты, название показывает, как призыв: р. _source.database_fields.email

При проверке этого элемента, что данные показывают, как:

href="mailto:[email protected]" class="button gaTracker" title="[email protected]" data-tracker-type="event" data-category="Email" data-label="gull-four-seasons-resort" data-action="Places to Stay">Email 

Я не уверен, как получить доступ к данным, как показано в совете браузера. Любая помощь была бы оценена, а также помогла бы мне понять HTML/CSS и как данные втягиваются на страницу в целом из базы данных.

Спасибо!

+0

Похоже, что данные, которые вы хотите очистить, отсутствуют на странице до загрузки начальной страницы, т. Е. Вы разбираете страницу с помощью Nokogiri, прежде чем у нее будет возможность получить данные. Вот вопрос с аналогичной проблемой: http://stackoverflow.com/q/4341387/3367343 – thohl

+0

7stud. Ты настоящий шпиль! Люди, вероятно, уважают вас. Также, спасибо за понимание.Я считаю, что я прочитал условия публикации и попытался создать обоснованный вопрос, который поможет другим, которые являются новыми для такой проблемы. thohl - спасибо, искренне. – user8264

+0

Добро пожаловать! – thohl

ответ

1

Следующий код сделает запрос GET на exploreminnesota.com только для только данных JSON, которые вы хотите - т. Е. Вам больше не нужен Nokogiri. Затем он преобразует ответ (временный файл) в объект Ruby JSON и красиво печатает объект на терминал.

require "open-uri" 
require "json" 

url = "http://www.exploreminnesota.com/getJsonData.ashx?id=61&keywords=&pageIndex=0&radius=0&mapTab=false&sortOrder=asc&sort=randomdaily&locationid=&startDate=false&class_id=7&lat=&lon=&city=&pageSize=20&type=reitlistings&attrFieldsOr=" 

response_file = open(url) # Make HTTP request and save as temp file 
response_json = JSON.parse(response_file.read) # Convert response to JSON 

puts JSON.pretty_generate(response_json) 

Примечание getJsonData.ashx в URL, назначенного url - этот URL будет получать данные в формате JSON, а не HTML.

Я нашел url с помощью инспектора Chrome. В инспекторе перейдите на вкладку «Сеть», установите флажок «Отключить кеш», обновите страницу и отфильтруйте результаты для типа запроса «XHR». Здесь вы увидите список запросов и ответов XHR, которые браузер сделал после начальной загрузки страницы (я подсчитал 6). Теперь отфильтруйте эти результаты для слова «город», и вы должны увидеть один сетевой запрос, о котором вы беспокоитесь. Нажмите на нее, затем перейдите на вкладку «Предварительный просмотр» - теперь вы можете исследовать ответ JSON прямо там, в инспекторе, путем расширения и свертывания объектов.

Если добавить следующую строку в моем примере выше:

puts response_json["hits"]["hits"][0]["_source"]["database_fields"]["email"] 

он будет печатать адрес электронной почты первого курорта.

Смежные вопросы