遍历所有<dd>标签并通过Mechanize / Nokogiri提取specefic信息

时间:2015-05-19 20:09:22

标签: html ruby nokogiri mechanize

我知道访问网站的基本内容所以(我刚开始学习昨天),但我想现在提取。我查看了许多Mechanize / Nokogiri的教程,但每个人都有不同的做事方式让我感到困惑。我想直接大胆地了解如何做到这一点:

我有这个网站:http://openie.allenai.org/sentences/rel=contains&arg2=antioxidant&title=Green+tea

我想以结构化的方式提取某些东西。如果我检查此网页的元素并转到正文,我会在<dd>..</dd>下看到很多<dl class="dl-horizontal">。它们中的每一个都有<a>部分,其中包含一个href。我想提取这个href和ex <b>green tea</b>文本的粗体部分。

我创建了一个简单的结构:

info = Struct.new(:ObjectID, :SourceID)因此,每个<dd>都会将粗体文本添加到对象ID,并将href添加到源ID。

这是我所拥有的代码的开始,只是检索不提取:

agent = Mechanize.new { |agent| agent.user_agent_alias = "Windows Chrome" }
html = agent.get('http://openie.allenai.org/sentences/?rel=contains&arg2=antioxidant&title=Green+tea').body
html_doc = Nokogiri::HTML(html)

另一件事是我对是否直接使用Nokogiri或通过Mechanize感到困惑。问题是Mechanize提供的文档不够,所以我想单独使用它。

现在我想知道如何遍历这些并提取信息。

1 个答案:

答案 0 :(得分:1)

这是一个如何解析您描述的锚元素的粗体文本和href属性的示例:

require 'nokogiri'
require 'open-uri'

url = 'http://openie.allenai.org/sentences/?rel=contains&arg2=antioxidant&title=Green%20tea'
doc = Nokogiri::HTML(open(url))

doc.xpath('//dd/*/a').each do |a|
  text = a.xpath('.//b').map {|b| b.text.gsub(/\s+/, ' ').strip}
  href = a['href']
  puts "OK: text=#{text.inspect}, href=#{href.inspect}"
end

# OK: text=["Green tea", "many antioxidants"], href="http://www.talbottteas.com/category_s/55.htm"
# OK: text=["Green tea", "potent antioxidants"], href="http://www.skin-care-experts.com/tag/best-skin-care/page/4"
# OK: text=["Green tea", "potent antioxidants"], href="http://www.specialitybrand.com/news/view/207.html"

简而言之,此解决方案在两个地方使用XPath:

  1. 最初查找每个a元素下的每个dd元素。
  2. 然后查找上面#1中b内的每个a元素。
  3. 最后一招是清理&#34; b&#34;当然,你可能希望它以某种方式看起来不同。