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

标签 javascript html xpath yql

我对 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-mater‌​nity-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 引擎中的错误 正在使用。 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/

相关文章:

javascript - 为什么 php 在打印数据时会在客户端断开连接时中止,但在其他情况下不会中止?

html - 为什么该图标在某些浏览器中显示而其他浏览器中不显示

javascript - 在同一个 html 页面上显示多个人力车图

xml - 使用 XSLT 查找给定一组参数的节点

html - Xpath:仅选择非嵌套预标记

sql-server - SQL Server XML类型从任何标记中选择Attribute = X

javascript - 表单字段选择的CSS更改

javascript - 在 vanilla JS 中通过多个 iframe 遍历 DOM

javascript - JavaScript 中的 Promise$2 是什么?

html - 子菜单不会显示为 block