-1

我有一个 html 页面,其中有许多<tr><td>元素,例如

<tr>
<td class="notextElementLabel width100">address:</td>
<td style="width: 100%" colspan="1" class="formFieldelement"><b>12284,CA</b></td>
</tr>

假设上面<tr>是第 4 个位置意味着在这个元素之前还有 3 个<tr>

现在我想获取地址的值,所以我正在做

$doc = new DOMDocument();
    @$doc->loadHTML($this->siteHtmlData);
    $tdElements = $doc->getElementsByTagName("td");
    $i=0;
    foreach ($tdElements as $node) {
        if(trim($node->nodeValue) == 'address:'){
            echo "\n\ngot it\n\n";
        }else{
            echo "\n\n---no ---\n\n";
        }

    }

如何获得“12284,CA”的值。请指导。

谢谢

4

3 回答 3

1

在您的情况下,查询背后的逻辑非常简单,可以完全用 XPath 语法表示:

//td[text()="address:"]/following-sibling::td/b/text()

这会找到<td>文本等于 的任何节点,"address:"获取以下内容<td>,进入<b>其中并获取它在那里找到的文本。

这意味着你可以做到

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
echo $xpath->evaluate('string(//td[text()="address:"]/following-sibling::td/b)');

它会立即输出您正在寻找的结果。

于 2012-06-21T12:40:43.700 回答
0

我自己得到了答案,类似于nickb的答案

$tdElements = $doc->getElementsByTagName("td");
    $tdCnt  = $tdElements->length;

    for ($idx = 0; $idx < $tdCnt; $idx++) {

        if(trim($tdElements->item($idx)->nodeValue) == 'address:'){
            echo $tdElements->item($idx+1)->nodeValue;
        }
    }

希望它会有所帮助

于 2012-06-21T12:40:56.497 回答
0

您必须获取<tr>元素,然后解析其子项,类似于:

$trElements = $doc->getElementsByTagName("tr");
foreach ($trElements as $node) {
    $children = $node->childNodes;
    foreach( $children as $child)
        echo $child->textContent; // or $child->nodeValue
}

这输出:address: 12284,CA

现在,如果有更多<tr>不是地址的元素,您将需要解析$children节点列表以确保找到"address:",然后一旦您这样做,您就知道下一个子节点的值就是您要查找的值。

于 2012-06-21T12:34:30.627 回答