【问题标题】:How to use ruby to get string between HTML <cite> tags?如何使用 ruby​​ 在 HTML <cite> 标签之间获取字符串?
【发布时间】:2009-09-18 02:07:14
【问题描述】:

大家好:

我很想从大量的 Google 搜索结果页面中获取一些信息。 我唯一需要的是一堆&lt;cite&gt;&lt;/cite&gt; HTML 标记中的 URL。

我无法以任何其他适当的方式解决这个问题,所以现在我正在转向 ruby​​。

这是我目前所写的:

require 'net/http'
require 'uri'

url=URI.parse('http://www.google.com.au')
res= Net::HTTP.start(url.host, url.port){|http|
    http.get('/#hl=en&q=helloworld')}
puts res.body

很遗憾,我不能使用推荐的 hpricot ruby​​ gem(因为它错过了 make 命令或其他什么?)

所以我想坚持这种方法。

现在我可以将响应正文作为字符串获取,我唯一需要做的就是检索 ciite 中的任何内容(删除 i 以查看真实名称 :))HTML 标记。

我该怎么做?使用正则表达式?谁能举个例子?

【问题讨论】:

  • 您为什么不发布一个问题,了解我们如何帮助您解决 hpricot 问题?

标签: ruby-on-rails ruby rubygems


【解决方案1】:

这是使用 Nokogiri 的一种方法:

Nokogiri::HTML(res.body).css("cite").map {|cite| cite.content}

【讨论】:

    【解决方案2】:

    我认为这会解决它:

    res.scan(/<cite>([^<>]*)<\/cite>/imu).flatten
    
    # This one to ignore empty tags:
    
    res.scan(/<cite>([^<>]*)<\/cite>/imu).flatten.select{|x| !x.empty?}
    

    【讨论】:

    • 如果引用中有任何 html 标签,包括斜体、粗体等,这将搞砸。如果开始标签有任何属性,它也会失败,但我不知道谷歌是否曾经这样做。这是处理这两种情况的替代正则表达式: /(.*?)/imu
    • 看起来很有趣,你能详细说明“”部分吗?只是为了记录......
    • (?:) 是一个非捕获组,因此 (?: .*?) 将非贪婪地匹配空格后跟任何其他字符。这 ?在括号之后使整个括号成为可选的。换句话说,“”之后,或者是一个空格,然后是一堆其他的东西。
    • 大家好:Google 非常友好,不会在 c i t e 标签中添加任何其他标签:) 这是个好消息,不是吗?
    【解决方案3】:

    如果您在使用 hpricot 时遇到问题,您也可以尝试 nokogiri,它非常相似,并且可以让您做同样的事情。

    【讨论】:

      【解决方案4】:

      在你想要的标签上拆分字符串。假设只有一个标签实例(或仅指定一个拆分),您将有两部分,我称之为头和尾。取 tail 并在结束标记上拆分它(一次),因此您现在将在新数组中有两个部分。新的头部是标签之间的内容,新的尾部是字符串的其余部分,如果标签出现多次,您可以再次处理。

      一个可能不完全正确但你明白的例子:

      head1, tail1 = str.split('<tag>', 1) # finds the opening tag
      head2, tail2 = tail1.split('</tag>', 1) # finds the closing tag
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 2023-03-25
        • 2013-08-09
        相关资源
        最近更新 更多