我知道访问网站的基本事情,所以(我昨天才开始学习),但我现在想提取。我查看了许多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:
- 最初查找每个
dd
元素下面的每个a
元素。 - 然后在上面#1中的
a
s中找到每个b
元素。
最后一个技巧是将"b"元素中的文本清理成可呈现的内容,当然,您可能希望它看起来有所不同。