![](/img/trans.png)
[英]Why does document.evaluate return XPath results as nested items?
[英]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-maternity-leave-proposal-20150911-gjkq81.html"
AND xpath = "//div[@class = 'articleBody']/*[self::ul or self::p]"
您可能会以XML以外的其他形式查看结果。 例如,如果您将其查看为JSON,则该格式没有预定义的地图顺序。 如果您将其视为XML,则顺序应符合预期。
我当前的XPath代码(上面)分别返回
<p>
元素和<ul>
元素
我相信这是yql使用的XPath引擎中的错误 。 XPath语言及其任何版本均明确指出,在将集合与联合运算符|
组合后,必须按文档顺序返回元素|
,通常与它们在XML 1中出现的顺序相同。
您可以尝试使用以下XPath来修复此错误行为,该XPath 首先选择所有子项, 然后进行过滤:
//div[@class = 'div class']/*[self::p or self::ul]
我认为它也更容易阅读。
注意:如果用双引号引起来的字符串,则不需要用\\'
转义单引号。
1 命名空间和属性节点没有顺序,但是顺序必须稳定,也就是说,两次选择相同节点的调用将以相同顺序返回它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.