【问题标题】:Xpath get text content from multiple and complicated tagsXpath 从多个复杂的标签中获取文本内容
【发布时间】:2018-11-20 18:42:14
【问题描述】:

我有这个 HTML 模板:

<center>
    <img src="image1">
    <br><br>
    <img src="image2">
    <br><br>
    <strong><em>TITLE1 :</em></strong> DESC1<br>
    <strong><em>TITLE2 :</em></strong> DESC2<br>
    <strong><em>TITLE3 :</em></strong> DESC3<br>
    <strong><em>TITLE4 :</em></strong> DESC4<br>
    <strong><em>TITLE5 :</em></strong> DESC5<br><br><br>
    <img src="image3">
    <br><br><br>DESC_GEN
</center>

我想使用 xpath 来得到这个预期的结果:

TITLE 1 = DESC 1
TITLE 2 = DESC 2
TITLE 3 = DESC 3
TITLE 4 = DESC 4
TITLE 5 = DESC 5
general = DESC_GEN

在一个数组中,这样我就可以在我的代码中的其他地方使用这些值。

这是我尝试过的:

$dom = new DOMDocument();
$dom->loadHTML($html_string);
$xpath = new DOMXpath($dom);

$elements = $xpath->query("//em");
foreach($elements as $e) {
    echo $e->nodeValue . '<br/>';
}

但不幸的是,这只返回 TITLE 1、TITLE 2、TITLE 3 等。

我想获取它们各自的值(在本例中为 DESC 1、DESC 2 等...)。

我可以采取什么方法来实现这个目标?

【问题讨论】:

    标签: php html xpath domdocument


    【解决方案1】:

    仅供参考,您使用的 HTML 模板不是格式良好的 xml 文档。它可能会也可能不会导致问题,具体取决于您的解析器。

    获得所需内容的最简单方法可能是首先获取标题列表

    //em/text()
    

    然后用

    获取描述列表
    //em/following::text()[1]
    

    然后用一般描述

    //center/text()[last()]
    

    最后只需要做一些字符串操作就可以得到你想要的形式。


    请注意,实际的 xpath 表达式可能会因特定的 HTML 文档而异。但是,以上内容应该适用于您提供的模板。

    【讨论】:

      【解决方案2】:

      走到父em,即xpah中的strong..,然后选择text()

      $elements = $xpath->query("//em");
      foreach($elements as $e) {
          $desc = $xpath->query("../following-sibling::text()", $e);
          echo $e->nodeValue . $desc[0]->nodeValue ."<br/>";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-20
        • 2013-03-16
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        相关资源
        最近更新 更多