如何使用xpath[PHP]分批解析HTML?
我尝试了各种方法,但都找不到解决办法。 我想在php中使用xpath从html代码中检索元素 例: 换句话说,我希望匹配的年龄与姓名保持一致 我尝试了以下方法:如何使用xpath[PHP]分批解析HTML?,php,parsing,xpath,domdocument,Php,Parsing,Xpath,Domdocument,我尝试了各种方法,但都找不到解决办法。 我想在php中使用xpath从html代码中检索元素 例: 换句话说,我希望匹配的年龄与姓名保持一致 我尝试了以下方法: $dom = new DOMDocument(); $dom->loadHTML($html); $xpathDom = new DomXPath($dom); $homepostcontentNodes = $xpathDom->query("//*[contains(@class, 'student')]//*[cont
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpathDom = new DomXPath($dom);
$homepostcontentNodes = $xpathDom->query("//*[contains(@class, 'student')]//*[contains(@class, 'name')]");`
但是,这只是获取节点的“名称”
我如何才能获得匹配的年龄节点?当然,它只是抓取节点
名称
-你是在告诉它
您需要分两步执行:
$studentNodes = $xpathDom->query("//div[contains(@class, 'student')]");
这将返回所有student
节点
步骤2
这就是魔法发生的地方。我们有我们的节点,我们可以循环通过它们(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);
全小提琴:对!我试着通过学生的方式循环,而你刚刚给了我我想要的答案。非常感谢@希吉斯泰兹:没问题。如果这就是你想要的,请随意接受它作为最佳答案。
$studentNodes = $xpathDom->query("//div[contains(@class, 'student')]");
$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);