过去,我使用简单的 Ruby 脚本成功地使用Nokogiri抓取网站。对于当前项目,我需要抓取一个仅使用内联 CSS 的网站。可以想象,这是一个旧网站。
我必须根据元素的内联 CSS 来定位页面上的特定元素有哪些可能性?似乎这对 Nokogiri 是不可能的,还是我忽略了一些东西?
更新:可以在这里找到一个例子。我基本上需要没有脚注的主要内容。后者具有较小的字体大小,并在每个部分下方分组。
过去,我使用简单的 Ruby 脚本成功地使用Nokogiri抓取网站。对于当前项目,我需要抓取一个仅使用内联 CSS 的网站。可以想象,这是一个旧网站。
我必须根据元素的内联 CSS 来定位页面上的特定元素有哪些可能性?似乎这对 Nokogiri 是不可能的,还是我忽略了一些东西?
更新:可以在这里找到一个例子。我基本上需要没有脚注的主要内容。后者具有较小的字体大小,并在每个部分下方分组。
您可以执行以下操作:
doc.css('*[style*="foo"]')
这将选择任何foo
出现在其样式属性中的任何元素。
我要教你怎么钓鱼。与其试图找到我想要的东西,有时更容易找到我不想要的东西并将其删除。
从这段代码开始:
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 进行挖掘的能力可能对您来说是值得的。