我对 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>
标签(后代而不是 sibling ),就不会有问题。该问题仅存在于不同类型的兄弟元素中。
为了复制我所看到的行为,我使用了以下内容:
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,则该格式没有预定义的 map 顺序。如果您将其视为 XML,则顺序应该符合预期。
原答案,留作引用:
My current XPath code (above) returns the
<p>
elements and the<ul>
element separately
我认为这是 XPath 引擎中的错误 yql正在使用。 XPath 语言,它的任何版本,都明确规定在将集合与联合运算符 |
组合后,元素必须按文档顺序返回。 ,这通常与它们在 XML1 中出现的顺序相同。
您可以尝试使用以下 XPath 修复此错误行为,它首先选择所有子项,然后然后过滤器:
//div[@class = 'div class']/*[self::p or self::ul]
我认为它也更易于阅读。
注意:您不需要使用 \'
来转义单引号如果你用双引号引用字符串。
1 命名空间和属性节点没有顺序,但顺序必须是稳定的,即两次选择相同节点的调用将以相同的顺序返回它们。
关于javascript - YQL 不按文档顺序返回带有联合运算符 (a|b) 的 xpath 选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32534419/