【问题标题】:Parsing HTML in PHP: get table onclick attribute value在 PHP 中解析 HTML:获取表格 onclick 属性值
【发布时间】:2015-02-14 09:55:09
【问题描述】:

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

我有下一个问题:

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

HTML 结构:

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

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

$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 />";
}

【问题讨论】:

    标签: php html dom


    【解决方案1】:

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

    基本语法

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

    如何跳过表头中的tr?

    这是可能的,但大多数时候进行正匹配更容易(所有 tr 都在 tbody 内)。想想tfoot里面的tr。

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

    如何获取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】:

      你试过获取节点值吗?

         foreach($dom->getElementsByTagName('td') as $link) {
          # Show the <a href>
      
          echo $link->nodeValue; //td value inside
          echo "<br />";
      

      }

      【讨论】:

      • 我想获得onlclick值??
      【解决方案3】:

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

      执行此操作的代码如下:

      $('#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++;
      });
      

      【讨论】:

      • 需要将值保存在 db 中,而我的代码工作的其他一些东西只需要 td 内的 onclick 值
      • 我不明白你想说什么。请解释一下,以便我理解并为你的问题提供适当的解决方案。
      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      相关资源
      最近更新 更多