我知道访问网站的基本内容所以(我刚开始学习昨天),但我想现在提取。我查看了许多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提供的文档不够,所以我想单独使用它。
现在我想知道如何遍历这些并提取信息。
答案 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:
a
元素下的每个dd
元素。b
内的每个a
元素。最后一招是清理&#34; b&#34;当然,你可能希望它以某种方式看起来不同。