繁体   English   中英

YQL不会按文档顺序返回带有联合运算符(a | b)的xpath选择查询

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

我对XPath的首次尝试-我正在努力寻找一个YQL选择查询的XPath条件,该条件从HTML页面依次输出不同的同级元素。 我可以获得所有单独的元素,每个元素都有其自己的顺序(所以<p1>, <p2>, <p3><ul1>, <ul2>, <ul3>等),但是没有遇到的顺序在源HTML文档中-例如<p1> <ul1> <ul2> <ul3> <p2> <p3>

我当前的“最适合”的是:

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保持选定的不同元素的顺序? 还是我只是完全误解了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代码(上面)分别返回<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,则顺序应符合预期。


原始答案,留作参考:

我当前的XPath代码(上面)分别返回<p>元素和<ul>元素

我相信这是使用的XPath引擎中的 XPath语言及其任何版本均明确指出,在将集合与联合运算符|组合后,必须按文档顺序返回元素| ,通常与它们在XML 1中出现的顺序相同。

您可以尝试使用以下XPath来修复此错误行为,该XPath 首先选择所有子项, 然后进行过滤:

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

我认为它也更容易阅读。

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

1 命名空间和属性节点没有顺序,但是顺序必须稳定,也就是说,两次选择相同节点的调用将以相同顺序返回它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM