【问题标题】:DOMDocument Parse htmlDOMDocument 解析 html
【发布时间】:2012-06-23 16:30:14
【问题描述】:

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

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

假设上面的 &lt;tr&gt; 位于第 4 位意味着在此元素之前还有 3 个 &lt;tr&gt;

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

$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”的值。请指导。

谢谢

【问题讨论】:

  • 如果你可以访问 HTML,你应该给你的目标一个 id,使用它你可以很容易地识别它。
  • @Truth : 看看它的客户端页面所以不要告诉我如果没有 id 就使用它,检查下面的答案,我们在这里给出正确的解决方案,而不是给出无用的建议。
  • @DineshGoyal:我们在这里传播知识。我们不是来冒犯那些给我们非常明智的建议的人,我们不是来要求别人免费解决我们自己的问题。
  • @Jon 我同意你的观点,但通过提问,我们正在增加知识,并为来访者提供更多选择。
  • @DineshGoyal:不。只有在您的问题普遍适用的情况下,这才是正确的。 “我怎样才能获得价值,这样我才能告诉我的老板我做了这份工作”不是这样的问题。

标签: php xpath html-parsing domdocument


【解决方案1】:

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

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

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

这意味着你可以做到

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

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

【讨论】:

  • 你能写完整的代码吗,为什么在你的代码前有注释 //td[text()
  • @DineshGoyal:那是因为 SO 语法荧光笔认为它是注释。实际上,它只是 XPath 语法。
【解决方案2】:

你必须得到&lt;tr&gt;元素,然后解析它的子元素,类似于:

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

这个输出:address: 12284,CA

现在,如果有更多不是地址的&lt;tr&gt; 元素,您将需要解析$children 节点列表以确保找到"address:",然后一旦找到,您就知道值of next child 是您要查找的值。

【讨论】:

    【解决方案3】:

    我自己得到的答案类似于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;
            }
        }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2011-02-04
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多