0

过去,我使用简单的 Ruby 脚本成功地使用Nokogiri抓取网站。对于当前项目,我需要抓取一个仅使用内联 CSS 的网站。可以想象,这是一个旧网站。

我必须根据元素的内联 CSS 来定位页面上的特定元素有哪些可能性?似乎这对 Nokogiri 是不可能的,还是我忽略了一些东西?

更新:可以在这里找到一个例子。我基本上需要没有脚注的主要内容。后者具有较小的字体大小,并在每个部分下方分组。

4

2 回答 2

2

您可以执行以下操作:

doc.css('*[style*="foo"]')

这将选择任何foo出现在其样式属性中的任何元素。

于 2013-05-21T09:35:46.010 回答
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 进行挖掘的能力可能对您来说是值得的。

于 2013-05-22T07:09:00.823 回答