在过去,我已经成功地使用Nokogiri使用一个简单的Ruby脚本抓取网站。对于当前的项目,我需要刮一个网站,只使用内联CSS。你可以想象,这是一个老网站。
根据元素的内联CSS,我有什么可能在页面上针对特定元素?似乎这在Nokogiri中是不可能的,还是我忽略了什么?
更新:在这里可以找到一个例子。我基本上只需要主要内容,不需要脚注。后者的字体较小,并分组在每个部分的下面。
我要教你怎么钓鱼。比起寻找我想要的,有时候找到我不想要的并删除它要容易得多。
从以下代码开始:
require 'nokogiri'
require 'open-uri'
URL = 'http://www.eximsystems.com/LaVerdad/Antiguo/Gn/Genesis.htm'
FOOTNOTE_ACCESSORS = [
'span[style*="font-size: 8.0pt"]',
'span[style*="font-size:8.0pt"]',
'span[style*="font-size: 7.5pt"]',
'span[style*="font-size:7.5pt"]',
'font[size="1"]'
].join(',')
doc = Nokogiri.HTML(open(URL))
doc.search(FOOTNOTE_ACCESSORS).each do |footnote|
footnote.remove
end
File.write(File.basename(URI.parse(URL).path), doc.to_html)
运行它,然后在浏览器中打开生成的HTML文件。在文件中滚动查找要删除的脚注。选择文本的一部分,然后使用"检查元素",或者任何你拥有的工具,可以在页面的源中找到被选中的文本。在该文本中找到一些独特的东西,使其能够从您想要保留的文本中分离出来。例如,我使用<span>
和<font>
标记中的font-size来定位脚注。
继续添加访问器到FOOTNOTE_ACCESSORS
数组,直到所有不需要的元素被删除。
这段代码并不完整,也没有像我通常为这类任务编写的那样紧凑,但它会给你一个如何处理这个特定任务的想法。
这是一个更灵活的版本:
require 'nokogiri'
require 'open-uri'
URL = 'http://www.eximsystems.com/LaVerdad/Antiguo/Gn/Genesis.htm'
FOOTNOTE_ACCESSORS = [
'span[style*="font-size: 8.0pt"]',
'span[style*="font-size:8.0pt"]',
'span[style*="font-size: 7.5pt"]',
'span[style*="font-size:7.5pt"]',
'font[size="1"]',
]
doc = Nokogiri.HTML(open(URL))
FOOTNOTE_ACCESSORS.each do |accessor|
doc.search(accessor).each do |footnote|
footnote.remove
end
end
File.write(File.basename(URI.parse(URL).path), doc.to_html)
主要区别在于以前的版本假设FOOTNOTE_ACCESSORS
中的所有条目都是CSS。通过此更改,还可以使用XPath。由于遍历条目,代码的运行时间会稍长一些,但是使用XPath的能力可能会让您觉得值得。
你可以这样做:
doc.css('*[style*="foo"]')
将选择任何在其style属性中出现foo
的元素