如何使用分隔符提取文本?

时间:2012-01-25 12:42:30

标签: ruby parsing nokogiri

如何从此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?

2 个答案:

答案 0 :(得分:1)

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

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

哪个匹配您要提取的两个<h2>标记。提取其他条目更复杂。我的xpath功夫在这方面缺乏,因为它与您不想捕捉的文本处于同一级别。

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

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

答案 1 :(得分:1)

我更喜欢保持简单:

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会找到有问题的标签,然后我就可以抓住我想要的那个,并继续处理。