【问题标题】:Xpath - get text from all h1, h3 p tags within a divXpath - 从 div 中的所有 h1、h3 p 标签中获取文本
【发布时间】:2013-12-05 18:51:44
【问题描述】:

我目前正在使用下面的查询来提取 <h1> <p><h3> 标记中的文本。

$xpath->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' grid_9 alpha omega newscontainer arena ')]/h1");
$xpath->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' grid_9 alpha omega newscontainer arena ')]/p");
$xpath->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' grid_9 alpha omega newscontainer arena ')]/h3");

虽然它们有时会以不同的顺序出现,所以我想按照在 html 中出现的顺序来捕捉它们。我确实用过

$xpath->query('//h1 | //p | //h3');

这很好用,但也捕获了上面指定的 div 类之外的一些 <p> 标签。按顺序使用它们根本不起作用。有没有办法将这些查询合并为一个?

基本上提取特定 div 类中的所有 h1、p 和 h3 标签?

【问题讨论】:

    标签: php dom html xpath


    【解决方案1】:

    你为什么不试试

    $xpath->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' grid_9 alpha omega newscontainer arena ')]/*[local-name()='h1' or local-name()='p' or local-name()='h3']");
    

    这应该按照它们出现的顺序为您提供节点,这些节点仅限于 div 父级的子级以及 XPath 1.0 中的节点,我认为这是一个未提及的先决条件。

    【讨论】:

    • 不幸的是,这只返回了带有p标签的元素,很奇怪。
    • 有一个错字!请在第一个 local-name() 之后添加括号。
    • 啊,这就解释了。现在可以了,谢谢!
    • 有趣。答案被接受一年多后,有人给了我一个未评论的反对票...
    【解决方案2】:

    当你使用 // 时会匹配任何带有这个标记名的元素

    你必须更具体,我建议你

    $xpath->query('//div/h1 | //div/p | //div/h3');
    

    【讨论】:

    • 这解决了,谢谢。不过,查询确实变得很大:) $xpath1->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' grid_9 alpha omega newscontainer arena ')]/h1 | //div[contains(concat(' ', normalize-space(@class), ' '), ' grid_9 alpha omega newscontainer arena ')]/p | //div[contains(concat(' ', normalize-space(@class), ' '), ' grid_9 alpha omega newscontainer arena ')]/h3");
    • @MGJ:如果知道这个查询是否保留了在文档中找到的标签的顺序,将会很有趣。
    • @Marcus-rickert:确实如此,至少我现在正在处理的数据是这样。这两个答案都提供了相同的结果。
    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 2011-01-13
    • 2020-08-23
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多