php - 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/>';
}
但不幸的是,这只返回 TITLE 1、TITLE 2、TITLE 3 等。
我想获得它们各自的值(在这种情况下是 DESC 1、DESC 2 等......)。
我可以采取什么方法来实现这一目标?
解决方案
走到xpah或xpah 中的父级em
,然后选择strong
..
text()
$elements = $xpath->query("//em");
foreach($elements as $e) {
$desc = $xpath->query("../following-sibling::text()", $e);
echo $e->nodeValue . $desc[0]->nodeValue ."<br/>";
}
推荐阅读
- c++ - 有没有办法保存用户输入的文本?
- flutter - Flutter bloc监听器中的延迟状态检查
- excel - 我可以使用 CSV 文件作为 Excel 数据透视数据源吗?
- flutter - 如何使 Flutter 应用程序字体大小独立于设备设置?
- c++ - C++ C4244 =':从 'std::streamsize' 转换为 'unsigned short',可能会丢失数据;任何解决方案?
- c# - C# nameof 运算符在发布配置中不起作用
- php - PHP搜索数组最快的方式(字母缩小实现)?
- xml - 如何在 .propdesc 文件中使用relatedProperty
- python - 如何将 `scipy.optimize.linprog` 用于更复杂的目标函数?
- typescript - TypeScript 类型谓词可以分配给变量吗