【问题标题】:How do I get all the text under a tag with Nokogiri?如何使用 Nokogiri 获取标签下的所有文本?
【发布时间】:2016-09-06 02:50:34
【问题描述】:

在此示例中,我尝试从表格的 <td> 标记中获取文本。一、html代码。

<table>
  <tbody>
  <tr>
    <td>Single line of text</td>
  </tr>
  <tr>
    <td>Text here<p>First line</p><p>Second line</p></td>
  </tr>
  </tbody>
</table>

然后是这里的ruby代码。

require 'nokogiri'
require 'pp'

html = File.open('test.html').read
doc = Nokogiri::HTML(html)
rows = doc.xpath('//table[1]/tbody/tr')

data = rows.collect do |row|
  row.at_xpath('td[1]/text()').to_s
end

pp data

我得到的结果是。

["Single line of text", "Text here"]

如何获取第二个&lt;td&gt; 标签中的所有文本?

【问题讨论】:

    标签: html ruby xpath nokogiri


    【解决方案1】:

    您需要进行两项更改才能获取所有text 节点。首先at_xpath 只会返回一个节点,因此要获得多个节点,您需要使用xpath

    其次,要获取所有后代节点,而不仅仅是子节点,请使用// 而不是/

    结合这些,代码行将是:

    row.xpath('td[1]//text()').to_s
    

    这会将所有文本节点连接在一起,给出结果:

    ["Single line of text", "Text hereFirst lineSecond line"]
    

    这可能不是你想要的。您需要进行处理以满足您的需求,而不仅仅是在结果节点集上调用 to_s

    【讨论】:

      【解决方案2】:

      这个怎么样?

      pp doc.search("//tr[2]//td//text()").map { |item| item.text }
      

      正如马特所说,您可以使用// 获取所有后代。

      如果您特别需要第二个tr,也可以对其进行索引。只需省略索引即可获取所有trs。

      您可以过滤生成的文本对象以仅获取上游具有td 的文本对象。

      最后,映射每个 Nokogiri 对象,将文本提取到最终数组中,如下所示:

      ["Text here", "First line", "Second line"]
      

      【讨论】:

        【解决方案3】:

        如果你想获取任何元素的所有文本,你需要Nokogiri::XML::Nodetext 方法:

        p doc.xpath('//table[1]/tbody/tr').map{ |tr| tr.text.strip }
        #=> ["Single line of text", "Text hereFirst lineSecond line"]
        

        strip 方法只是去掉了前导和尾随空格。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-16
          • 1970-01-01
          • 2014-09-29
          • 1970-01-01
          • 2019-07-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多