使用DOM从第二个HTML表中提取数据,忽略第一个表
Pull data from second HTML table using DOM, ignore first table
我有下面的PHP脚本,它是通过命令提示符运行的,如果一页上只有一个表,它会很好地工作,但如果我在一页上有两个表,我只会尝试取出第一个表,在某些情况下,我有没有办法忽略第一个表而只处理第二个表?
我无法控制HTML,因此无法使用ID来定位表。
HTML
<html>
</head>
...
</head>
<body>
<table>
<tr>
<th>Problem Table</th>
</tr>
<tr>
<td>Annoying table in the way!</td>
</tr>
</table>
<hr/>
<table>
<tr>
<th>ID</th>
<th>Asset</th>
</tr>
<tr>
<td>34234234</td>
<td>Website3</td>
</tr>
<tr>
<td>34234234</td>
<td>Website4</td>
</tr>
</table>
</body>
</html>
PHP
$dom = new DOMDocument();
$html = $dom->loadHTMLFile($url);
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');
$rows = $tables->item(0)->getElementsByTagName('tr');
$cols = $rows->item(0)->getElementsByTagName('th');
$row_headers = null;
foreach($cols AS $node) {
$row_headers[] = $node->nodeValue;
}
$table = array();
$rows = $tables->item(0)->getElementsByTagName('tr');
foreach($rows AS $row) {
$cols = $row->getElementsByTagName('td');
$row = array();
$i = 0;
foreach($cols AS $node) {
if ($row_headers != null) {
$row[$row_headers[$i]] = $node->nodeValue;
}
$i++;
}
if (!empty($row)) {
$table[] = $row;
}
}
我同意@GCC404的观点,即应该使用ID或类更好地针对元素,因为这很容易导致错误。
但是,如果您特别想针对最后一个表,您只需要将0
替换为找到的项目数减去1:
$rows = $tables->item( $tables->length - 1 )->getElementsByTagName('tr');
// etc.
使用getElementsByTagName()
时,可以使用DOMNodelist::item指定索引。
这可能只适用于您无法控制源HTML或确信始终有两个表的情况,但如果您可以控制HTML,我建议您只为每个表设置一个id/类。
$dom = new DOMDocument();
$html = $dom->loadHTMLFile($url);
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');
$rows = $tables->item(1)->getElementsByTagName('tr');
$cols = $rows->item(1)->getElementsByTagName('th');
$row_headers = null;
foreach($cols AS $node) {
$row_headers[] = $node->nodeValue;
}
$table = array();
$rows = $tables->item(1)->getElementsByTagName('tr');
foreach($rows AS $row) {
$cols = $row->getElementsByTagName('td');
$row = array();
$i = 0;
foreach($cols AS $node) {
if ($row_headers != null) {
$row[$row_headers[$i]] = $node->nodeValue;
}
$i++;
}
if (!empty($row)) {
$table[] = $row;
}
}
相关文章:
- 而循环只设置php中输入字段中的第一个值
- 使用ajax将数据从一个步骤发送到下一个步骤的3步表单
- 用javascript将数据从一个窗口传递到另一个窗口
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- IE11中的第二个调用取消了第一个Fetch API调用
- Javascript XMLHttpRequest——只有第一个POST请求有效
- 使用javascript或angularjs特定过滤器搜索字符串中第一个img标记的json值
- 将OnClick函数设置为<ul>,最后一个ul是擦除第一个ul-s
- RxJS油门行为;立即获取第一个值
- Angular UI网格:如何通过第一个UI网格中的按钮使第二个UI网格可见
- 选择多个实例中的第一个
- 在dojo中将数据从一个选项卡绑定到另一个选项卡(打开选项卡?)
- 与杜兰达尔合作的第一个JavaScript项目.尝试从第三方 API 获取数据
- 数据表删除按钮在其他页面上不起作用,除了第一个
- Vue js 获取数据模型的第一个值
- 如何以第二个 JavaScript 形式加载数据,然后解析为第一个 JavaScript 形式
- 第一个jQuery插件-如何以正确的方式保存关联元素数据
- 使用DOM从第二个HTML表中提取数据,忽略第一个表
- Ajax:第一个Post很棒,第二个Post返回URL中的数据
- 为什么第一个$.传递数据对象时发生Ajax错误