open-uri + hpricot & nokogiri неправильно анализируют HTML - PullRequest
2 голосов
/ 31 августа 2009

Я пытаюсь проанализировать веб-страницу, используя open-uri + hpricot, но, похоже, это проблема в процессе анализа, поскольку гемы не приносят мне то, что я хочу.

В частности, я хочу получить div (чей идентификатор 'pasajes' ) по этому URL:

http://www.despegar.com.ar

Я пишу этот код:

require 'nokogiri'
require 'hpricot'
require 'open-uri'

document = Hpricot(open('http://www.despegar.com.ar/')) # WITH HPRICOT
document2 = Nokogiri::HTML(open('http://www.despegar.com.ar/')) # WITH NOKOGIRI

pasajes = document.search("//div[@id='pasajes']")
pasajes2 = document2.xpath("//div[@id='pasajes']")

Но это НИЧЕГО не приносит! Я много чего пробовал в hpricot и nokogiri:

  1. Я пытаюсь дать абсолютный путь к этому div
  2. Я пробую путь CSS с селекторами
  3. Я пытаюсь использовать ярлык поиска hpricot (doc // "div # pasajes")
  4. Почти каждый возможный относительный путь для достижения div 'pasajes'

Наконец-то я нашел ужасное решение. Я использовал библиотеку watir и после открытия веб-браузера передал html hpricot. Таким образом, hpricot ПРИЗНАЙТЕ div 'pasajes'. Но я не хочу просто открывать веб-браузер только для разбора ...

Что я делаю не так? Open-uri работает плохо? Это hpricot?

Ответы [ 4 ]

4 голосов
/ 31 августа 2009

На статической HTML-странице нет DIV с идентификаторами pasajes. Если вы используете * nix, вы можете увидеть это, выполнив:

curl http://www.despegar.com.ar/ | grep pasajes

Я предполагаю, что это сгенерированный JavaScript.

Если вы используете MacRuby, вы можете попробовать Линдон .

3 голосов
/ 31 августа 2009

На этой странице нет div с id 'pasajes'. В этом проблема.

1 голос
/ 10 октября 2009

Я столкнулся с аналогичной проблемой с Nokogiri, но на OS X 10.5. Тем не менее, я сначала попытался открыть open-uri, чтобы открыть страницы, на которых есть много HTML-тегов. Я нашел с помощью:

urldoc = open('http://hivelogic.com/articles/using_usr_local')
urldoc.readlines{|line| puts line}

Я бы увидел много прекрасного HTML. Я также обнаружил, что, прочитав «файл» в строку и передав его в Nokogiri, я смог заставить его работать нормально. Мне даже пришлось изменить само демо, которое они используют на rubyforge, чтобы рассказать вам о Нокогири.

Используя собственный пример, я получаю это:

>> doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))
=> <!DOCTYPE html>

>> doc.children
=> 

YUCK!

Если я настрою чтение в URL-адресе строки, я получу хороший материал:

>> doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove').read)
=> <!DOCTYPE html>
<html>
<head>
..... TONS OF HTML HERE ........
</div>
</body>
</html>

Примечание Я вижу это прекрасное предупреждение, когда использую irb для игры:

HI. Вы используете libxml2 версии 2.6.16, которой более 4 лет. много ошибок. Мы предлагаем для максимального удовольствия разбора HTML / XML, вы обновите вашу версию libxml2 и переустановите nokogiri. Если вам нравится использовать libxml2 версия 2.6.16, но не нравится это предупреждение, пожалуйста, определите константу I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2, прежде чем потребовать нокогири.

Но я не в настроении иметь дело с ужасами и различными экспертами, но противоречащим советам по исправлению libxml в / usr / local blah blah. Сообщение о тексте ссылки прекрасно объясняет это, но затем другой * nix wizard атакует саму концепцию с некоторыми звуковыми предупреждениями и проблемами. Поэтому я говорю «ни за что».

Почему я пишу это? Потому что IMO, я думаю, что может быть связь между моим блюзом Nokogiri и предупреждением libxml. OS X 10.5 на старом материале, и они могут иметь проблемы с этим.

ВОПРОС

Есть ли у других пользователей OS X 10.5 эта проблема с Nokogiri?

1 голос
/ 03 сентября 2009

Это больше подходит как дополнительный комментарий к ответу Джонаса выше, а не сам по себе ответ ... Но я новичок в SO и пока не обладаю "полномочиями комментировать":)

Вы можете использовать Selenium RC, чтобы загрузить полный HTML, а затем использовать nokogiri в загруженном файле. Обратите внимание, что это будет работать только в том случае, если контент генерируется / модифицируется Javascript. Если веб-страница зависит от файлов cookie для настройки содержимого, то, как вы заметили, вы можете выбрать Selenium (в браузере) или watir.

Я бы хотел услышать лучшее решение для этого (хочу проанализировать веб-страницу с помощью nokogiri, но страница изменена JS).

...