【问题标题】:Get link and href text from html doc with Nokogiri & Ruby?使用 Nokogiri 和 Ruby 从 html doc 获取链接和 href 文本?
【发布时间】:2012-02-17 21:59:17
【问题描述】:

我正在尝试使用 nokogiri gem 来提取页面上的所有 url 及其链接文本并将链接文本和 url 存储在哈希中。

<html>
    <body>
        <a href=#foo>Foo</a>
        <a href=#bar>Bar </a>
    </body>
</html>

我想回来

{"Foo" => "#foo", "Bar" => "#bar"}

【问题讨论】:

    标签: ruby nokogiri


    【解决方案1】:

    这是一个单行:

    Hash[doc.xpath('//a[@href]').map {|link| [link.text.strip, link["href"]]}]
    
    #=> {"Foo"=>"#foo", "Bar"=>"#bar"}
    

    拆分一下,可以说更具可读性:

    h = {}
    doc.xpath('//a[@href]').each do |link|
      h[link.text.strip] = link['href']
    end
    puts h
    
    #=> {"Foo"=>"#foo", "Bar"=>"#bar"}
    

    【讨论】:

    • 您可以将 link.attributes['href'].value 替换为 link['href']
    • 提示:在 Ruby 2.1 中,而不是 Hash[...] 追加 .to_h
    【解决方案2】:

    另一种方式:

    h = doc.css('a[href]').each_with_object({}) { |n, h| h[n.text.strip] = n['href'] }
    # yields {"Foo"=>"#foo", "Bar"=>"#bar"}
    

    如果您担心可能有相同的文本链接到不同的内容,那么您可以在数组中收集 hrefs:

    h = doc.css('a[href]').each_with_object(Hash.new { |h,k| h[k] = [ ]}) { |n, h| h[n.text.strip] << n['href'] }
    # yields {"Foo"=>["#foo"], "Bar"=>["#bar"]}
    

    【讨论】:

    • a 标签的问题在于它可以用于链接和非链接,如命名锚点。您必须检查 href 属性是否存在。
    • @Mark:我想我在你评论的时候换成了a[href]
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多