【问题标题】:How can I extract text with <br> delimiters?如何提取带有 <br> 分隔符的文本?
【发布时间】:2012-01-26 03:23:10
【问题描述】:

如何从这个 HTML 代码中提取:

<body>
  <div class="div1">
    <div class="div2">
      <div class="div3">
        <div class="div3.1">
          <h2 class="notopgap">HEADER</h2>
          <br>DONT WANT THIS TEXT
          <br><a href='mailto:info@mylink.pt'>info@mylink.pt</a>
          <br><h2>I WANT THIS TEXT</h2>
          <br>TEXT: WANT THIS
          <br>DONT WANT THIS
          <a name='#lev3'></a>
          <h2>FINALLY I WANT THIS TOO</h2><br>
          <div class="div3.1.1">
            BUNCH OF TEXT ...

以下文字:

WANT THIS TEXT
WANT THIS
FINALLY I WANT THIS TOO

与 Nokogiri/Ruby 合作?

我可以在 div 和其他元素之间进行提取,但是当我想要的文本的每个部分之间没有 div,而只有 br 时,我该怎么做呢?

【问题讨论】:

  • 您想要什么和不想要什么的区别是什么?特别是什么决定了你想要“TEXT: WANT THIS”而不是“DONT WANT THIS”?
  • 区别在于
    TEXT: ... 直到下一个
  • 所以你想要后面跟着&lt;br&gt;的文本,而不是后面跟着&lt;br&gt;的文本not
  • 你的逻辑一点都不清楚。很高兴您提供了示例输入和所需的输出,但是您没有清楚地传达是什么让某些区域特别而其他区域没有。

标签: ruby parsing nokogiri


【解决方案1】:

首先,您可以使用以下 xpath:

doc = Nokogiri::HTML(html)
doc.xpath("//div[@class='div3.1']/h2[not(@class = 'notopgap')]").map(&:text)

这将匹配您要提取的两个 &lt;h2&gt; 标记。提取另一个条目更复杂。我的 xpath 功夫在这方面有所欠缺,因为它与您不想捕获的文本处于同一水平。

我可能会退回到与文本匹配。

text = doc.xpath("//div[@class='div3.1']").text()
text.scan(/TEXT:(.*)\n/).flatten

【讨论】:

    【解决方案2】:

    我更喜欢保持简单:

    require 'nokogiri'
    
    doc = Nokogiri::HTML(<<EOT)
    <body>
    <div class="div1">
    <div class="div2">
    <div class="div3">
        <div class="div3.1">
            <h2 class="notopgap">HEADER</h2>
                    <br>DONT WANT THIS TEXT
                    <br><a href='mailto:info@mylink.pt'>info@mylink.pt</a>
                    <br><h2>I WANT THIS TEXT</h2>
                    <br>TEXT: WANT THIS
                    <br>DONT WANT THIS
                    <a name='#lev3'></a>
                    <h2>FINALLY I WANT THIS TOO</h2><br>
                        <div class="div3.1.1">
    EOT
    
    h2 = doc.search('h2')
    h2[1].text                            # => "I WANT THIS TEXT"
    doc.search('br')[3].next_sibling.text # => "TEXT: WANT THIS\n                "
    h2[2].text                            # => "FINALLY I WANT THIS TOO"
    

    从那时起,清理"TEXT: WANT THIS\n " 就很容易了。

    我知道我将有多个点击,因此与其尝试使用 XPath 到达我想要的位置,一个简单的 CSS 将找到有问题的标签,然后我可以获取我想要的特定标签,并继续处理。

    【讨论】:

    • 与你的回答无关:我喜欢你的 Gravatar Redundant\: See "redundant" ;-)
    • @JamWaffles,哈哈,你是第一个注意到的。
    猜你喜欢
    • 2019-12-14
    • 2021-07-01
    • 2017-06-25
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多