在PHP中解析HTML:获取表onclick属性值

时间:2015-02-14 09:55:10

标签: php html dom

我想解析HTML页面以从表中获取数据(基本上我想遍历所有tr标签)。

我有下一个问题:

  1. 如何跳过表头中的tr
  2. 如何获取onclick代码的td属性值?
  3. 如何计算每个td
  4. 中的tr

    HTML结构:

    <tr>
      <td onclick="window.location='home.php?navi=148';">kkkk</td>
      <td>demo</td>
      <td>kkkk</td>
    </tr>
    

    我想获得 window.location =&#39; home.php?navi = 148&#39;; 我正在使用的代码:

    $url = $html;
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $html = curl_exec($ch);
    curl_close($ch);
    
    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    
    # Iterate over all the <a> tags
    foreach($dom->getElementsByTagName('td') as $link) {
        # Show the <a href>
        print_r($link);
        echo "<br />";
    }
    

3 个答案:

答案 0 :(得分:0)

您是否尝试获取节点值?

   foreach($dom->getElementsByTagName('td') as $link) {
    # Show the <a href>

    echo $link->nodeValue; //td value inside
    echo "<br />";

}

答案 1 :(得分:0)

您已经在使用DOM扩展,但是您错过了DOMXPath。它允许您使用XPath表达式来获取文档的一部分。它可以返回节点列表或标量。

基本语法

$xpath = new DOMXPath($dom);
$result = $xpath->evaluate($expression, $optionalContext);

如何在表格中跳过tr?

这是可能的,但大多数情况下更容易进行正匹配(tbody中的所有tr)。想一想tfoot里面的tr。

tbody中的所有内容://table/tbody/tr
所有tr直接在表格中://table/tr
父母不是thead //table//tr[name(parent::*) != 'thead']

的所有tr

如何获取td标签的onclick属性值?

这是标量值 - 因此您需要将其强制转换为字符串:

string(//table/tbody/tr/td/@onclick)

如何计算每个tr中的td

这将需要一个组合,首先获取tr,然后使用tr作为上下文计数:

foreach ($xpath->evaluate('//table/tbody/tr') as $tr) {
  var_dump($xpath->evaluate('count(td)', $tr);
}

答案 2 :(得分:-1)

而不是使用php为什么不使用javascript来实现你想要的......

执行此操作的代码如下:

$('#tableId tr').each(function(){
    defaultData[i] = new Array();
    j = 0;
    $(this).find('td').each(function(){
        defaultData[i][j] = $(this).html();
        if (defaultData[i][j].length > 150)
        {                
            defaultData[i][j] = $(this).find('select').val();
        }
        j++;
    });
    i++;
});