使用xPath提取文本(以呈现顺序)?

时间:2011-06-22 08:31:41

标签: html xml xpath

Hiall,

我已经和他斗争了几天了。我已经尝试了所有我能想到的东西和网上的一切。我正试图从浏览器呈现的表格(从每个表格)中提取文本,无论其他的是什么(我确定还有其他情况)。我认为这几乎可以说明问题(我尽可能地保持这个问题)。

<html>
<head></head>
<body>
  <table class='infobox vcard' style="font-size: 95%" id="sortable_table_id_0">
    <tbody>
      <tr>
        <td><a href="/wiki/Germania_(airline)" title="Germania (airline)">Germania</a></td>
        <td><b>Seasonal</b>: Munich, Nuremberg [begins 31 July]
          <sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span>[</span>5<span>]</span></a></sup>
        </td>
      </tr>
    </tbody>
  </table>
</body>
</html>

到目前为止,我想出的最好的是:

xpath("//table[@class='infobox vcard']/descendant::*[not(@class='reference') and text()]")

但是,当我遍历数组时,文本的顺序是不正确的。例如,最后一项()将显示为:

  

慕尼黑,纽伦堡[7月31日开始]   季节性的5 []

有什么想法吗?

非常感谢, 史蒂夫

2 个答案:

答案 0 :(得分:0)

我对这些结果感到惊讶。从技术上讲,XPath 1.0返回一个节点集,并且一个集没有定义的顺序,因此无法保证结果的顺序。 (XSLT总是以文档顺序处理XPath结果,但这并不意味着XPath必须按文档顺序提供它们。)在实践中(这在XPath 2.0中变得明确),人们期望结果将在文档中返回订单,这不是你得到的。尝试使用不同的XPath处理器,最好是声称符合XPath 2.0的处理器,这在这一点上是严格的。

答案 1 :(得分:0)

使用xpath("//table[@class='infobox vcard']//text()[not(@class='reference')]")获取以下数组:

['\n    ',
 '\n      ',
 '\n        ',
 'Germania',
 '\n        ',
 'Seasonal',
 ': Munich, Nuremberg [begins 31 July]\n          ',
 '[',
 '5',
 ']',
 '\n        ',
 '\n      ',
 '\n    ',
 '\n  ']

这似乎保留了秩序。