【问题标题】:Use PHP Simple HTML DOM Parser to find table cell and get contents of next sibling使用 PHP Simple HTML DOM Parser 查找表格单元格并获取下一个兄弟的内容
【发布时间】:2013-03-24 04:04:24
【问题描述】:

我正在尝试使用 PHP Simple HTML DOM Parser 来获取外部文件的 HTML。该文件包含一个表格,目标是找到具有特定数据内容的能够单元格,然后获取下一个同级单元格的数据。此数据需要放入 PHP 变量中。

基于在How to parse and process HTML/XML with PHP?Grabbing the href attribute of an A elementScraping Data: PHP Simple HTML DOM Parser 和当然PHP Simple HTML DOM Parser Manual 等文章中发现的研究和信息,我已经能够产生一些结果,但恐怕我可能在走错路了。

表格行如下所示:

<tr>
<td>fluff</td>  
<td>irrelevant</td> 
<td>etc</td>   
<td><a href="one">Hello world</a></td>                        
<td>123.456</td> 
<td>fluff</td>          
<td>irrelevant</td>   
<td>etc</td>
</tr>

我想要完成的是找到包含“Hello world”的表格单元格,然后从下一个 td 单元格中获取数字。以下代码找到该表格单元格并回显其内容,但我尝试将其用作地标以获取下一个单元格的数据失败了...

$html = file_get_html("http://site.com/stuff.htm");
$e = $html->find('td',0)->innertext = 'Hello world';
echo $e;

所以最终,在上面的示例中,值 123.456 需要以某种方式进入 PHP 变量。

感谢您的帮助!

【问题讨论】:

  • 找到你的元素,然后使用 next_sibling() 获取它的“邻居”
  • @Marc:我能够找到元素的内部文本:$e = $html-&gt;find('td',0)-&gt;innertext = 'Hello world';,但我不确定一旦找到该元素如何引用它。
  • find(td,0) 返回该元素,然后您立即从中提取内部文本。如果是find(td,0)-&gt;next_sibling(),你会在你找到的那个之后得到td。

标签: php dom html-parsing


【解决方案1】:

使用简单的 html dom 解析器:

$str = "<table><tr>
<td>fluff</td>  
<td>irrelevant</td> 
<td>etc</td>   
<td><a href=\"one\">Hello world</a></td>                        
<td>123.456</td> 
<td>fluff</td>          
<td>irrelevant</td>   
<td>etc</td>
</tr></table>";

$html = str_get_html($str);

 $tds = $html->find('table',0)->find('td');
 $num = null;
 foreach($tds as $td){

     if($td->plaintext == 'Hello world'){

        $next_td = $td->next_sibling();
        $num = $next_td->plaintext ;    
        break; 
     }
 }

 echo($num);

【讨论】:

  • 谢谢阿迪迪。这有效并返回所需的结果。如果我理解的话,它会遍历每个表以及每个表中的每个 td,当它找到具有所需值的 td 时,它会获取下一个兄弟的明文值。是这样吗,这意味着该搜索将在所有表中还是仅在 DOM 中的第一个表中进行?
  • 你可以决定——这段代码遍历第一个表:$html-&gt;find('table',0) 零索引表示它找到的第一个表标签
【解决方案2】:

可以使用DOMXPath 类来完成。为此,您不需要外部库。

这里有一个例子:

<?php

$html = <<<EOF
<tr>
<td>fluff</td>  
<td>irrelevant</td> 
<td>etc</td>   
<td><a href="one">Hello world</a></td>                        
<td>123.456</td> 
<td>fluff</td>          
<td>irrelevant</td>   
<td>etc</td>
</tr>
EOF;


// create empty document 
$document = new DOMDocument();

// load html
$document->loadHTML($html);

// create xpath selector
$selector = new DOMXPath($document);

// selects the parent node of <a> nodes
// which's content is 'Hello world'
$results = $selector->query('//td/a[text()="Hello world"]/..');

// output the results 
foreach($results as $node) {
    echo $node->nodeValue . PHP_EOL;
}

【讨论】:

  • 这个例子确实让我找到了元素的内部文本。那么我将如何获得下一个兄弟的内部文本?
  • 为此使用$node-&gt;nextSibling-&gt;nodeValue;。请注意,DOMXpath 比 PHP Simple Html DOM 解决方案快得多
  • 太棒了。这也很有效,并且不需要包含 PHP Simple DOM Parser。谢谢heh2mgl!
猜你喜欢
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2012-08-12
  • 2012-04-08
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多