php - 从 url 得到 html table - td 有嵌套元素

php - get html table from url - td have nested elements

我有一个 URL,其中包含 table,如下所示

<table id='table1'>
   <tr>
    <td>
     <div class='us'>
     </div>
    </td>
    <td>
     <div>
      <span>text1</span>
     </div>
    </td>
    <td>
     <span>text2</span>
    </td>
    <td>text3</td>
   </tr>
   <tr>
    <td>
     <div class='jo'></div>
    </td>
    <td>
     <div>
      <span>text4</span>
     </div>
    </td>
    <td>
     <span>text5</span>
    </td>
    <td>text6</td>
   </tr>
</table>

我想像这样使用 php

从 table 获取数据
us - text1 - text2 - text3
jo - text4 - text5 - text6

如果 td 没有子元素我可以获取数据当 td 有子元素时会出现问题,例如 td 中的 div 另请注意,在第 1 列中,我需要 class inside div inside td

所以基本上我需要一个循环遍历第一列中的 table 行的代码我需要 td 中 div 的 class,在第二列中我需要 span 中的文本在 div 内 td 内,在第三列中我需要在 span 内在 td 内的文本 在第四列中我只需要在 td 内的文本,目前我唯一能得到的列是第 4 列,因为文本直接在 td

有什么想法吗?

把 HTML 变成 DOMDocument, then fetch the requested values using XPath queries:

$html = <<<EOS
<table id='table1'>
   <tr>
    <td>
     <div class='us'>
     </div>
    </td>
    <td>
     <div>
      <span>text1</span>
     </div>
    </td>
    <td>
     <span>text2</span>
    </td>
    <td>text3</td>
   </tr>
   <tr>
    <td>
     <div class='jo'></div>
    </td>
    <td>
     <div>
      <span>text4</span>
     </div>
    </td>
    <td>
     <span>text5</span>
    </td>
    <td>text6</td>
   </tr>
</table>
EOS;

// Load HTML into a DOMDocument
$dom = new DOMDocument();
$dom->loadHTML($html);

// Find div's with class attribute
$xPath = new DOMXPath($dom);
$divsWithClassAttribute = $xPath->query('//div[@class]');

// Loop through divs
foreach ($divsWithClassAttribute as $div) {
    // Create row array starting with class name
    $row = array($div->getAttribute('class'));

    // Get siblings of the td parent of each div
    $siblings = $xPath->query('parent::td/following-sibling::td', $div);

    // Loop through (td) siblings and extract text content
    foreach ($siblings as $sibling) {
        $row[] = trim($sibling->textContent); // Add text value
    }

    // Output row
    echo implode(' - ', $row), PHP_EOL;
}

输出:

us - text1 - text2 - text3
jo - text4 - text5 - text6