YQL 不 return 一个 xpath select 查询与文档顺序中的联合运算符 (a|b)

YQL does not return an xpath select query with a union operator (a|b) in document order

我对 XPath 的第一次尝试 - 我正在努力寻找 YQL select 查询的 XPath 条件,该查询输出 顺序 来自 HTML 页。我可以获得所有单独的元素,每个元素都有自己的顺序(因此 <p1>, <p2>, <p3><ul1>, <ul2>, <ul3>,等等),但不是按照它们在源 HTML 文档中遇到的顺序 - 比如说, <p1> <ul1> <ul2> <ul3> <p2> <p3>.

我目前的'best fit'是:

select * from html WHERE url = "URL of web page" AND xpath = "//div[@class = \'div class\']/p | //div[@class = \'div class\']/ul"

转换为 XPath:

//div[@class = 'div class']/p | //div[@class = 'div class']/ul

我可以很容易地得到很多像 //div[@class = 'div class']/text() 这样的文本,但后来我失去了格式。有什么方法可以让 YQL 保持 selected 不同元素的顺序吗?还是我完全误解了 XPath 的工作原理?

编辑:样本HTML结构:

<div class = "class">
  <p>Some text</p>
  <p>Following is a list:</p>
  <ul>
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
  </ul>
  <p>Still more text</p>
</div>

我目前的XPath代码(以上)returns <p>元素和<ul>元素分开,虽然<p>元素是顺序的,但是没有确定 <ul> 元素确切位置的方法(它可以因页面而异)。因此,我无法从 XPath 重建 HTML。如果我使用 /text(),则返回全文,按从上到下的顺序,但没有格式(忽略 <p><ul> 标签)——只有一行各个元素之间没有空格的文本。如果 <ul> 标签在 <p> 标签内(后代而不是兄弟),就不会有问题。该问题仅存在于不同类型的兄弟元素中。

为了复制我所看到的行为,我使用了以下内容:

SELECT * FROM html 
   WHERE url = "http://www.smh.com.au/sport/soccer/matildas-fuming-after-ffa-rejects-paid-mater‌​nity-leave-proposal-20150911-gjkq81.html" 
   AND xpath = "//div[@class = 'articleBody']/*[self::ul or self::p]"

使用您评论中的答案进行编辑:

您看到的结果可能不是 XML。例如,如果您将其视为 JSON,则该格式没有预定义的地图顺序。如果您将其视为 XML,顺序应该符合预期。


原回答,留作参考:

My current XPath code (above) returns the <p> elements and the <ul> element separately

我认为这是 使用的 XPath 引擎中的错误。 XPath 语言,它的任何版本,都明确指出在将集合与联合运算符 | 组合后,元素必须按文档顺序 returned,这通常与它们的顺序相同出现在 XML1.

您可以尝试使用以下 XPath 修复此错误行为,其中 first 选择所有子项,然后 then 过滤器:

//div[@class = 'div class']/*[self::p or self::ul]

我认为它也更容易阅读。

注意:如果用双引号引用字符串,则不需要用 \' 转义单引号。

1 命名空间和属性节点没有顺序,但顺序必须稳定,即两次调用选择相同的节点会return 它们的顺序相同。