我尝试了各种各样的东西,却找不到解决方案。 我想在php中使用xpath从html代码中检索元素。
例如:
<div class='student'>
<div class='name'>Michael</div>
<div class='age'>26</div>
</div>
<div class='student'>
<div class='name'>Joseph</div>
<div class='age'>27</div>
</div>
我想检索信息并将它们放在一个数组中,如下所示:
$student[0][name] = Michael;
$student[0][age] = 26;
$student[1][name] = Joseph;
$student[1][age] = 27;`
换句话说,我希望匹配的年龄与名字保持一致。
我尝试了以下内容:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpathDom = new DomXPath($dom);
$homepostcontentNodes = $xpathDom->query("//*[contains(@class, 'student')]//*[contains(@class, 'name')]");`
然而,这只是抓住节点的名字' 如何获得匹配的年龄节点?
答案 0 :(得分:2)
当然它只抓取节点name
- 你告诉它!
您需要做的是分两步:
这是数据线性化的标准步骤,XPath查询很简单:
你几乎拥有它:
$studentNodes = $xpathDom->query("//div[contains(@class, 'student')]");
这将返回所有student
个节点。
这就是魔术发生的地方。我们有节点,我们可以遍历它们(DOMNodeList
实现Iterator
,所以我们可以foreach
- 循环遍历它们。我们需要弄清楚的是如何找到自己的孩子......
......等等。 DOMNode
实现了一个名为getNodePath
的方法,它返回到节点的完整,直接的XPath路径。这样我们就可以简单地追加/div
来获得节点的所有div直接后代!
另一个快速的foreach,我们得到这个代码:
$studentNodes = $xpathDom->query("//div[contains(@class, 'student')]");
$result = array();
foreach ($studentNodes as $v) {
// Child nodes: student
$r = array();
$columns = $xpathDom->query($v->getNodePath()."/div");
foreach ($columns as $v2) {
// Attributes allows me to get the 'class' property of the node. Bit clunky, but there's no alternative
$r[$v2->attributes->getNamedItem("class")->textContent] = $v2->textContent;
}
$result[] = $r;
}
var_dump($result);