HTML читается перед полной загрузкой с использованием open-uri и nokogiri.

Я использую open-uri и nokogiri с ruby ​​для простого веб-сканирования. Есть одна проблема, иногда html читается до полной загрузки. В таких случаях я не могу получить какой-либо контент, кроме значка загрузки и панели навигации. Как лучше всего сказать open-uri или nokogiri дождаться полной загрузки страницы?

В настоящее время мой скрипт выглядит так:

require 'nokogiri'
require 'open-uri'

url = "https://www.the-page-i-wanna-crawl.com"
doc = Nokogiri::HTML(open(url, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE)) 
puts doc.at_css("h2").text

person Chelsea White    schedule 09.12.2012    source источник
comment
Источник example.com не имеет тега ‹h2›.   -  person rputikar    schedule 09.12.2012
comment
Это просто заполнитель для моего вопроса. Извините, что ввел в заблуждение.   -  person Chelsea White    schedule 09.12.2012
comment
Определите полную загрузку, как насчет изображений, внешних скриптов, контента ajax и т. д.?   -  person Dave Newton    schedule 09.12.2012
comment
Я имею в виду основную часть страницы (список блогов) без внешних скриптов и ajax-контента.   -  person Chelsea White    schedule 09.12.2012
comment
Вы уверены, что происходит именно то, что вы думаете? То есть вы проверяли с помощью curl или подобного? Описанного вами поведения я не видел.   -  person Dave Newton    schedule 09.12.2012
comment
Да, я проверил с помощью curl, и в основной части страницы отображается только значок загрузки. Когда я открываю страницу в браузере, я также вижу значок загрузки, и примерно через 2 секунды появляется содержимое основной части.   -  person Chelsea White    schedule 09.12.2012
comment
Это предполагает, что контент загружается через AJAX или какой-либо другой метод JS и что исходный HTML-код (который может видеть только curl/nokogiri) не содержит того, что вы хотите. В этом случае вам нужно будет выбрать другой парсер, поддерживающий JS/ajax.   -  person Philip Hallstrom    schedule 09.12.2012
comment
Понятно! Спасибо за совет.   -  person Chelsea White    schedule 10.12.2012
comment
Или узнайте URL-адрес AJAX для нужного контента и запросите его напрямую.   -  person Mark Thomas    schedule 10.12.2012


Ответы (1)


То, что вы описываете, невозможно. Результат open будет передан в HTML только после того, как метод open вернет полное значение.

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

require 'nokogiri'
require 'watir'

browser = Watir::Browser.new
browser.goto 'https://www.the-page-i-wanna-crawl.com'

doc = Nokogiri::HTML.parse(browser.html)

Однако это может открыть окно браузера.

person akuhn    schedule 09.12.2012
comment
Это очень удобно. Спасибо! - person Chelsea White; 10.12.2012
comment
Есть ли способ избежать открытия браузера? - person lcguida; 14.10.2015
comment
@lcguida browser = Watir::Browser.new :chrome, безголовый: true - person Seph Cordovano; 17.04.2018