使用Nokogiri解析HTML时遇到问题

时间:2013-09-12 02:58:27

标签: ruby html-parsing nokogiri

我正在从网站解析HTML文件,但是我遇到了从文件中获取所有数据的问题。

<tr>
<td class="color_line1" valign="center" align="left">Cemopel - Cm Petroleo Ltda.</td>
<td class="color_line1" valign="center" align="left">Avenida Rui Barbosa, 879 0</td>
<td class="color_line" valign="left"><a class="linkpadrao" href="javascript:Direciona('GRA%C3%87AS');">Gra###</a></td>
<td class="color_line" valign="center" align="center">SHELL</td>
<td class="color_line" valign="center" align="center">2,899</td>
<td class="color_line" valign="center" align="center"> - </td>
<td class="color_line" valign="center" align="center">-</td>
<td class="color_line" valign="center" align="center">-</td>
<td class="color_line" valign="center" align="center">04/09/2013</td>
</tr>

文件的另一部分:

<tr>
<td class="lincol" valign="center" align="left">E.u. Ten#### Neto Combust###is</td>
<td class="lincol" valign="center" align="left">Avenida Marechal Mascarenhas de Morais, 4900 </td>
<td valign="left"><a class="linkpadrao" href="javascript:Direciona('IMBIRIBEIRA');">Imbiribeira</a></td>
<td valign="center" align="center">COSAN COMBUST##EIS</td>
<td valign="center" align="center">2,899</td>
<td valign="center" align="center">2,505</td>
<td valign="center" align="center">CIF</td>
<td valign="center" align="center">-</td>
<td valign="center" align="center">04/09/2013</td>
</tr>
<tr>

我正在使用'linkpadrao'类,使用父母来获取数据。它工作正常,但我无法获得'linkpadrao'类以上的数据:

posto.parent.search('~ td').map &:text

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在css-selector ~ td中,~是一般的兄弟选择器。不幸的是,兄弟选择器(一般和相邻)只选择后的兄弟节点。这就是为什么你不能获得以前的td元素。 Css选择器没有前一个兄弟选择器。

由于你想要所有的td元素,你可以再向上移动一个父元素到tr元素,然后获取所有的td元素:

posto.parent.parent.search('td').map &:text
#=> E.u. Ten#### Neto Combust###is
#=> Avenida Marechal Mascarenhas de Morais, 4900 
#=> Imbiribeira
#=> COSAN COMBUST##EIS
#=> 2,899
#=> 2,505
#=> CIF
#=> -
#=> 04/09/2013

请注意,我假设posto是链接节点。

或者,您可以使用xpath,它具有前一个兄弟选择器。但是,在这种情况下,它看起来不太好:

posto.parent.xpath('./following-sibling::td|preceding-sibling::td').map &:text