【问题标题】:How do I extract a HTML topic heading from a web page?如何从网页中提取 HTML 主题标题?
【发布时间】:2011-12-24 02:35:17
【问题描述】:

给定一个像“What popular startup advice is plain wrong?”这样的页面,我希望能够提取右上角主题标题下的第一个主题,在本例中为“常见误解”。

在 Ruby 中对我来说最好的方法是什么?是 Nokogiri 还是正则表达式?大概我需要做一些 HTML 解析?

【问题讨论】:

    标签: ruby web web-crawler


    【解决方案1】:

    首先,您几乎从不希望使用正则表达式来解析/提取/折叠/旋转/破坏 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
    

    代码采用了一些捷径,应该可以始终如一地工作:

    1. 使用 Ruby 的OpenURI 可以轻松访问 Internet 资源。对于大多数简单到普通的应用程序,这是我的首选。还有更强大的工具,但没有一个更方便。
    2. doc.at 告诉 Nokogiri 遍历文档,并找到 CSS 访问器“span a.topic_name span”的第一个匹配项,它应该在该页面中作为第一个条目保持一致。

    请注意,Nokogiri 支持搜索节点的一些变体:atsearchat% 以及诸如 css_at 之类的东西会找到第一个匹配项并返回 Node,这是一个单独的标签或文本或评论。 search/ 和这些变体返回一个 NodeSet,它就像一个节点数组。您必须使用某种数组访问器遍历该列表或提取所需的单个节点。在上面的代码中,我可以说doc.search(...).first 来获取我想要的节点。

    Nokogiri 还支持使用 XPath 访问器,但对于大多数事情,我通常会使用 CSS。它更简单,更易于阅读,但您的里程可能会有所不同。

    【讨论】:

    • 嗨,这真的很有帮助。它工作得很好,直到不久前突然,我开始收到 503 Service Unavailable (OpenURI::HTTPError)。我假设这是网站对对服务器的请求变得挑剔。有解决办法吗?
    • 如果他们禁止了您,则无法解决。这就是为什么遵守他们的规则并遵守他们的服务条款很重要的原因。 503 可能意味着他们的服务器离线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多