首页 > 解决方案 > PHP DOM-Document 和 XPath:获取类数据

问题描述

我在尝试使用 DOM 解析跨度 cass 中的文本时遇到问题。这是我的代码示例。尝试从网页中提取一些行 - 使用以下技术:使用 DOMDocument 提取元素的属性值

以下是我收集和学习的内容:

$remote = "http://website.com/";
$doc = new DOMDocument();
@$doc->loadHTMLFile($remote);
$xpath = new DOMXpath($doc);
$node = $xpath->query('//span[@class="user"]');
echo $node;

这将返回以下错误->“可捕获的致命错误:DOMNodeList 类的对象无法转换为字符串”。我很迷茫。。

我想做的是解析这个标签之间的用户名;

<div class="widget plugin-meta">
            <h3 class="screen-reader-text">Meta</h3>

见下文:

这里是具体示例视图源:https ://wordpress.org/plugins/participants-database/ 和https://wordpress.org/plugins/participants-database/

**goal:** i need the following data:

版本:上次更新:活动安装:已测试:

查看源代码:https ://wordpress.org/plugins/participants-database/

诉讼;我检查了网页的来源。我试图找出 texte 是否与某种模式有关。我仔细观察发现它们都有 class=”widget plugin-meta”。好吧-这将使提取它们变得轻而易举。我尝试使用下面的代码有助于根据属性值过滤 html 元素。

但不幸的是,结果很糟糕;我需要帮助,需要知道如何解析上述数据

目标:我需要以下数据:版本:上次更新:活动安装:测试:

标签: pythonphpxml

解决方案


Xpath 表达式可以返回节点列表或标量值 - 取决于表达式。但是DOMXpath::query()(和SimpleXMLElement::xpath())仅支持节点列表返回值。对于标量结果,您需要使用DOMXpath::evaluate(). Xpath 允许string()将第一个找到的节点转换为字符串的功能。

$html = <<<'HTML'
<div class="widget plugin-meta">
  <h3 class="screen-reader-text">Meta</h3>
</div>
HTML;

$document = new DOMDocument();
@$document->loadHTML($html);
$xpath = new DOMXpath($document);
echo $xpath->evaluate('string(//h3[@class="screen-reader-text"])');

如果您期望多个节点,则需要迭代它们并获取它们的文本内容。

foreach ($xpath->evaluate('//h3[@class="screen-reader-text"]') as $h3) {
  echo $h3->textContent;   
}

plugin如果您想避免部分匹配(例如作为 的一部分) ,匹配类属性会稍微复杂一些plugin-meta。它们是由空格分隔的标记列表。Xpath 1.0 没有直接匹配它的功能。但它具有连接和规范化字符串的方法。

$expression = '//div[contains(concat(" ", normalize-space(@class), " "), " plugin-meta ")]/h3';
foreach ($xpath->evaluate($expression) as $h3) {
  echo $h3->textContent;   
}

推荐阅读