【问题标题】:PHP DOM/xpath check element span class valuePHP DOM/xpath 检查元素跨度类值
【发布时间】:2017-09-12 14:21:09
【问题描述】:

在 curl 请求中,我有一个具有以下结构的 html 表。我现在只想提取包含空类的 span 元素的表行,而不是 class="subcomponent" 的表行。 我成功地尝试了 Xpath 来查找具有空类的元素,但是如何获得包含 Version 和 Partnumber 的整个 <tr> 甚至更好的特定 <td> 节点。 提前致谢。

<table>
...
<tbody>
    <tr>
        <td></td>
        <td></td>
        <td>
            <span class="">Product</span>
        </td>
        <td>Version</td>
        <td>Partnumber</td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td>
            <span class="subcomponent">Component</span>
        </td>
        <td>Version</td>
        <td>Partnumber</td>
    </tr>
</tbody>

我的 PHP 代码

$doc = new DOMdocument();
libxml_use_internal_errors(true);
$doc->loadHTML($page);
$doc->saveHTML();
$xpath = new DOMXpath($doc);
$query ='//span[@class=""]';
$entries = $xpath->query($query);

foreach ($entries as $entry) {
    echo $entry->C14N();
}

【问题讨论】:

    标签: php html xpath


    【解决方案1】:

    要使用 SimpleXML 访问表行本身,您可以使用以下命令:

    $sxml = simplexml_load_string('<table>...</table>');
    
    $rows = $sxml->xpath('//tr[td/span[@class=""]]');
    
    foreach ($rows as $row) {
      echo "Version: ", $row->td[3], ", Partnumber: ", $row->td[4];
    }
    

    XPath 的工作原理是选择所有具有子 &lt;td&gt;&lt;tr&gt; 标记,该子标记本身具有带有空白类的子 &lt;span&gt;

    在循环中,您需要按编号访问每行的子单元格,因为您的示例并未表明它们以任何其他方式标记。我假设表结构不会经常更改,所以应该没问题。

    有关示例,请参阅 https://eval.in/860169

    备选 DOMDocument 版本

    如果您要获取完整的网页,该网页不一定是格式正确的,您可能需要使用DOMDocument,就像在第一个示例中一样。访问子元素有点不干净,但类似以下的方法会起作用:

    $doc = new DOMdocument;
    libxml_use_internal_errors(true);
    $doc->loadHTML($page);
    $xpath = new DOMXpath($doc);
    $rows = $xpath->query('//tr[td/span[@class=""]]');
    
    foreach ($rows as $row) {
        $cells = $row->getElementsByTagName('td');
    
        $version = $cells->item(3)->nodeValue;
        $partNumber = $cells->item(4)->nodeValue;
    
        echo "Version: {$version}, Part Number: {$partNumber}", PHP_EOL;
    }
    

    https://eval.in/860217

    【讨论】:

    • 我通过 curl 命令获取表格并将其存储在 $page.xml 中。我将如何使用您的代码?
    • 如果页面格式正确,您应该可以使用$sxml = simplexml_load_string($page); 而不是第一行。我还用 DOMDocument 编辑了答案,以防万一。
    • 谢谢 - 替代 DOMDocument 方法效果很好!
    【解决方案2】:

    我会使用下一个 XPath 表达式:

    //td[text()="Version"] | //td[text()="Partnumber"]
    

    这给了我:

    Element='<td>Version</td>'
    Element='<td>Partnumber</td>'  
    Element='<td>Version</td>'
    Element='<td>Partnumber</td>'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 2014-08-07
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多