如何使用xpath [PHP]批量解析HTML?

时间:2013-05-27 23:53:02

标签: php parsing xpath domdocument

我尝试了各种各样的东西,却找不到解决方案。 我想在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')]");`

然而,这只是抓住节点的名字' 如何获得匹配的年龄节点?

1 个答案:

答案 0 :(得分:2)

当然它只抓取节点name - 你告诉它!

您需要做的是分两步:

  1. 挑出所有学生节点
  2. 对于每个学生节点,请选择
  3. 这是数据线性化的标准步骤,XPath查询很简单:

    第1步

    你几乎拥有它:

     $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);
    

    完全小提琴:http://codepad.viper-7.com/t868Wh