过去,我已成功使用Nokogiri使用简单的Ruby脚本来抓取网站。对于当前项目,我需要抓一个只使用内联CSS的网站。可以想象,这是一个旧网站。
我有什么可能根据元素的内联CSS定位页面上的特定元素?看来这对Nokogiri来说是不可能的,还是我忽视了什么?
更新:可以找到一个示例here。我基本上需要没有脚注的主要内容。后者的字体较小,并在每个部分下面分组。
答案 0 :(得分:2)
您可以执行以下操作:
doc.css('*[style*="foo"]')
这将选择foo
出现在其样式属性中的任何位置的任何元素。
答案 1 :(得分:2)
我要教你如何钓鱼。而不是试图找到我想要的东西,有时候更容易找到我不想要的东西并将其删除。
从这段代码开始:
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>
标签中的字体大小找到脚注。
继续向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的能力可能会让你感到值得。