使用基于嵌入式CSS样式的Ruby Scrape网站

时间:2013-05-21 09:23:06

标签: ruby web-scraping nokogiri

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

我有什么可能根据元素的内联CSS定位页面上的特定元素?看来这对Nokogiri来说是不可能的,还是我忽视了什么?

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

2 个答案:

答案 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的能力可能会让你感到值得。