解析元素的前一个元素(忽略其中的其他元素)

时间:2016-01-07 20:59:16

标签: ruby html-parsing nokogiri

我有一个非常长的HTML文件,包含许多不同的表。我只想解析某些表格,但遗憾的是<table>标记在这里没有任何帮助。

我想要解析的表格如下:

<tr>
<td> TEXT1 </td>
<td> <a class='unique identifier' ...> TEXT2 </a></td>
</tr>

我想要&#34; TEXT1&#34;和&#34; TEXT2&#34;。我知道如何获得&#34; TEXT2&#34;:它总是在<a>标签中,到目前为止我的解决方案是

//a[(@class="unique identifier")]

注意:有时&#34; TEXT1&#34;是<p>标签,有时它不是。有时会有其他标签,例如<b><br><em>等。我认为我需要获取之前的<td>内容。我找到的<a>,但忽略了其中的任何其他元素。

我怎样才能告诉Nokogiri每一个&#34; TEXT2&#34;我已经找到回去并获得之前的<td>,这样我就能得到#34; TEXT1&#34;?

1 个答案:

答案 0 :(得分:2)

我会做类似的事情:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<tr>
<td> TEXT1 </td>
<td> <a class='uid'> TEXT2 </a></td>
</tr>
EOT

wrapping_tr = doc.at('//a[@class="uid"]/../..')
nodes = wrapping_tr.search('td')

nodes.map(&:text) 
# => [" TEXT1 ", "  TEXT2 "]

我建议花时间阅读the XPath documentation因为这是非常基本的。