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-maternity-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
我认为这是 yql 使用的 XPath 引擎中的错误。 XPath 语言,它的任何版本,都明确指出在将集合与联合运算符 |
组合后,元素必须按文档顺序 returned,这通常与它们的顺序相同出现在 XML1.
您可以尝试使用以下 XPath 修复此错误行为,其中 first 选择所有子项,然后 then 过滤器:
//div[@class = 'div class']/*[self::p or self::ul]
我认为它也更容易阅读。
注意:如果用双引号引用字符串,则不需要用 \'
转义单引号。
1 命名空间和属性节点没有顺序,但顺序必须稳定,即两次调用选择相同的节点会return 它们的顺序相同。
我对 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-maternity-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
我认为这是 yql 使用的 XPath 引擎中的错误。 XPath 语言,它的任何版本,都明确指出在将集合与联合运算符 |
组合后,元素必须按文档顺序 returned,这通常与它们的顺序相同出现在 XML1.
您可以尝试使用以下 XPath 修复此错误行为,其中 first 选择所有子项,然后 then 过滤器:
//div[@class = 'div class']/*[self::p or self::ul]
我认为它也更容易阅读。
注意:如果用双引号引用字符串,则不需要用 \'
转义单引号。
1 命名空间和属性节点没有顺序,但顺序必须稳定,即两次调用选择相同的节点会return 它们的顺序相同。