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
我有一个 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