【发布时间】:2011-12-24 02:35:17
【问题描述】:
给定一个像“What popular startup advice is plain wrong?”这样的页面,我希望能够提取右上角主题标题下的第一个主题,在本例中为“常见误解”。
在 Ruby 中对我来说最好的方法是什么?是 Nokogiri 还是正则表达式?大概我需要做一些 HTML 解析?
【问题讨论】:
标签: ruby web web-crawler
给定一个像“What popular startup advice is plain wrong?”这样的页面,我希望能够提取右上角主题标题下的第一个主题,在本例中为“常见误解”。
在 Ruby 中对我来说最好的方法是什么?是 Nokogiri 还是正则表达式?大概我需要做一些 HTML 解析?
【问题讨论】:
标签: ruby web web-crawler
首先,您几乎从不希望使用正则表达式来解析/提取/折叠/旋转/破坏 XML 或 HTML。它可能出错的方法太多了。正则表达式非常适合某些工作,但 XML/HTML 提取并不适合。
也就是说,这就是我使用 Nokogiri 要做的事情:
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.quora.com/What-popular-startup-advice-is-plain-wrong'))
topic = doc.at('span a.topic_name span').content
puts topic
运行输出:
Common Misconceptions
代码采用了一些捷径,应该可以始终如一地工作:
OpenURI 可以轻松访问 Internet 资源。对于大多数简单到普通的应用程序,这是我的首选。还有更强大的工具,但没有一个更方便。doc.at 告诉 Nokogiri 遍历文档,并找到 CSS 访问器“span a.topic_name span”的第一个匹配项,它应该在该页面中作为第一个条目保持一致。请注意,Nokogiri 支持搜索节点的一些变体:at 与 search。 at 和 % 以及诸如 css_at 之类的东西会找到第一个匹配项并返回 Node,这是一个单独的标签或文本或评论。 search、/ 和这些变体返回一个 NodeSet,它就像一个节点数组。您必须使用某种数组访问器遍历该列表或提取所需的单个节点。在上面的代码中,我可以说doc.search(...).first 来获取我想要的节点。
Nokogiri 还支持使用 XPath 访问器,但对于大多数事情,我通常会使用 CSS。它更简单,更易于阅读,但您的里程可能会有所不同。
【讨论】: