Xpath从多个复杂的标签中获取文本内容



我有这个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/>';
}

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

我想得到它们各自的值(在这种情况下,DESC 1,DESC 2等…(

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

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

获得想要的东西最简单的方法可能是首先使用获得标题列表

//em/text()

然后使用获取描述列表

//em/following::text()[1]

然后用进行一般描述

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

最后,只需进行一些字符串操作,就可以将其转换为所需的形式。


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

走到父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/>";
}

最新更新