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