2016-05-31 4 views
2

Я пытаюсь разобрать http://www.pro-medic.ru/index.php?ht=246&perpage=all с Nokogiri, но, к сожалению, я не могу получить все элементы со страницы.Анализ больших файлов HTML с помощью Nokogiri

Мой простой тест код:

require 'open-uri' 
require 'nokogiri' 

html = Nokogiri::HTML open('http://www.pro-medic.ru/index.php?ht=246&perpage=all') 
p html.css('ul.products-grid-compact li .goods_container').count 

Он возвращает только 83 пунктов, но реальный отсчет около 186.

Я думал, что проблема может быть в open, но мне кажется, что функция читает HTML-страницы правильно.

Есть ли у кого-то такая же проблема?

ответ

3

Файл, кажется, превышает пределы анализатора Нокигири. Вы можете расслабить ограничения пути добавления HUGE флага:

require 'open-uri' 
require 'nokogiri' 

url = 'http://www.pro-medic.ru/index.php?ht=246&perpage=all' 
html = Nokogiri::HTML(open(url)) do |config| 
    config.options |= Nokogiri::XML::ParseOptions::HUGE 
end 
html.css('ul.products-grid-compact li .goods_container').count 
#=> 186 

Обратите внимание, что |= является оператором побитового ИЛИ задания, не следует путать его с логическим оператором ||=

Согласно Parse Options, вы можете также установить этот флаг через config.huge

+0

Большое спасибо Stefan! Я предполагал, что должно быть какое-то ограничение размера страницы. Но 'html.css ('ul.products-grid-compact li .goods_container'). Count' теперь занимает слишком много времени для вычисления. Есть ли способ ускорить его? Или это просто из-за большого размера страницы и не имеет к этому никакого отношения? – Aleksey

+0

Быстрая проверка показывает, что разметка нарушена. Это приводит к дереву узлов с глубиной 571, и такое дерево занимает очень много времени, чтобы пройти. Вы должны дезинфицировать страницу перед ее подачей в Нокигири. Я использовал Safari для сохранения фиксированной версии страницы, и для подсчета элементов потребовалось всего полсекунды (без каких-либо изменений конфигурации). – Stefan

+0

Stefan вы можете сказать мне, как вы проверяете разметку? Есть ли способ сделать это из кода автоматически? – Aleksey

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