Как извлечь текст с разделителями <br>? - PullRequest
0 голосов
/ 25 января 2012

Как мне извлечь из этого 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

с Нокогири / Руби?

Я могу извлечь между div и другими элементами, но как я могу это сделать, когда между каждой частью текста, который я хочу, нет div, а только br?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Я предпочитаю быть проще:

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 найдет нужные теги, затем я смогу получить нужный тег и продолжить обработку.

1 голос
/ 25 января 2012

Для начала вы можете использовать следующий xpath:

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

Который будет соответствовать двум <h2> тегам, которые вы хотите извлечь. Извлечение другой записи более сложное. Мой xpath kung fu отсутствует на этом фронте, потому что он находится на том же уровне, что и текст, который вы не хотите захватывать.

Я, вероятно, вернусь к сопоставлению с текстом.

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