使用Nokogiri解析大型HTML文件

3
我将尝试使用Nokogiri解析http://www.pro-medic.ru/index.php?ht=246&perpage=all,但不幸的是我无法获取页面上的所有项目。
我的简单测试代码如下:
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页面。

是否有其他人遇到了同样的问题?

1个回答

4

文件似乎超出了Nokogiri解析器的限制。您可以通过添加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

请注意,|= 是位或赋值运算符,不要将其与逻辑运算符||=混淆。
根据解析选项,您也可以通过config.huge设置此标志。

非常感谢你,Stefan!我想页面大小肯定有一些限制。不过现在 html.css('ul.products-grid-compact li .goods_container').count 命令计算的时间太长了。是否有办法加快速度?还是仅仅因为页面很大而无法解决呢? - Aleksey
Stefan,你能告诉我如何检查标记?有没有办法通过代码自动完成这个任务呢? - Aleksey
我的意思不是从代码中检查,而是进行清理。 类似于 source = open(url).sanitize - Aleksey
1
抱歉,不行。也许http://softwarerecs.stackexchange.com的人可以推荐一个库。 - Stefan
2
请注意,对于单个配置选项,您可以通过使用config方法更简单地应用它:html = Nokogiri.HTML( open(url), &:huge ) - Phrogz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接