Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用xpath[PHP]分批解析HTML?_Php_Parsing_Xpath_Domdocument - Fatal编程技术网

如何使用xpath[PHP]分批解析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

我尝试了各种方法,但都找不到解决办法。 我想在php中使用xpath从html代码中检索元素

例:

换句话说,我希望匹配的年龄与姓名保持一致

我尝试了以下方法:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpathDom = new DomXPath($dom);
$homepostcontentNodes = $xpathDom->query("//*[contains(@class, 'student')]//*[contains(@class, 'name')]");`
但是,这只是获取节点的“名称”
我如何才能获得匹配的年龄节点?

当然,它只是抓取节点
名称
-你是在告诉它

您需要分两步执行:

  • 选择所有学生节点
  • 对于每个学生节点,选择列
  • 这是数据线性化的标准步骤,XPath查询很简单:

    第一步 你几乎拥有它:

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