遍历所有<dd>标签并通过机械化/Nokogiri 提取特定信息



我知道访问网站的基本事情,所以(我昨天才开始学习),但我现在想提取。我查看了许多Mechanize/Nokogiri的教程,但每个教程都有不同的操作方式,这让我感到困惑。我想要一个直接的粗体方式来做这件事:

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

,我想以一种结构化的方式提取某些东西。如果我检查这个网页的元素并进入正文,我看到<dl class="dl-horizontal">下有很多<dd>..</dd>。每一个都有一个<a>部分,其中包含一个href。我想把这段引文和正文的粗体部分摘录出来。

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

info = Struct.new(:ObjectID, :SourceID)因此,从这些<dd>中,每个CC_6将在对象id中添加粗体文本,并在源id中添加href。

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

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没有提供足够的文档,所以我想单独使用它。

现在我想知道如何循环通过这些并提取信息。

下面是如何从所描述的锚元素中解析粗体文本和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. 最初查找每个dd元素下面的每个a元素。
  2. 然后在上面#1中的a s中找到每个b元素。

最后一个技巧是将"b"元素中的文本清理成可呈现的内容,当然,您可能希望它看起来有所不同。

相关内容

  • 没有找到相关文章

最新更新