php - 如何使用 PHP 抓取 HTML 表格数据
问题描述
编辑:没有说清楚。我正在使用 PHP
我正在尝试制作一个现代化的 Boxrec 网站,我正在从 Wikipedia 中抓取数据。在拳击手的每个维基百科页面中,他们都有一张他们的战斗表。我已经成功地从不同的表中提取了胜利、失败和平局数据。我将如何使用 PHP 将战斗表数据提取到某种(2D?)纯文本数组中?
这是表格的链接(这是第二张表格,更大的一张) https://en.wikipedia.org/wiki/Sugar_Ray_Robinson#Professional_boxing_record
这是我尝试过的代码(我可能完全不同意)
$dom = new domDocument;
$dom->loadHTML($table);
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');
$rows = $tables->item(1)->getElementsByTagName('tr');
foreach ($rows as $row) {
$cols = $row->getElementsByTagName('td');
echo $cols[2];
}
这给了我
警告:DOMDocument::loadHTML(): Unexpected end tag : div in Entity, line: 4375 in C:\xampp\htdocs\boxing\search\index.php on line 38
解决方案
我看到的几个问题:
$tables->item(1)->getElementsByTagName('tr');
将始终为您提供页面中的第二个表格,该表格将是右侧“个人统计信息”块中的表格- 由于
$cols[2]
不是简单类型的对象,您将收到警告而不是内容。用于echo $cols[2]->textContent
输出内部文本。
如果您正在解析结果表,我建议加载所有表,然后根据结果表中不同的表标题进行检查。然后提取适当的列。
示例代码:
以下代码仅显示如何检查表中的示例标题“结果”,然后将输出结果列。请根据您想要的目的进行调整。
<?php
$table = file_get_contents('https://en.wikipedia.org/wiki/Sugar_Ray_Robinson');
$dom = new DOMDocument;
$dom->loadHTML($table);
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');
foreach ($tables as $singleTable) {
try {
$rows = $singleTable->getElementsByTagName('tr');
// check if we are parsing the right table:
$row1= $rows[0]->getElementsByTagName('th');
$isResultTable= FALSE;
foreach ($row1 as $th) {
if (trim($th->textContent) === 'Result') {
$isResultTable = TRUE;
}
}
if (!$isResultTable) continue;
foreach ($rows as $row) {
$cols = $row->getElementsByTagName('td');
echo $cols[2]->textContent;
}
} catch (Exception $ex) {
print_r($ex);
}
}
推荐阅读
- c# - PDF 文件不在 Windows 窗体的 webBrowser 控件中
- ruby - ruby IO.gets 是否从缓冲区读取?
- vue.js - spa nuxt 项目中的 .nuxt 文件夹与 dist 文件夹
- math - 计算弧度以使玩家面对单位 - 从玩家(X,Y)到单位(X,Y)
- git - 如何返回上一次提交并将旧文件复制到新文件夹
- php - php:给定一个艺术家列表,并且必须确定哪个艺术家的名字最长
- jquery - 使用 jQuery 更改没有 ID 的 HTML Span
- javascript - 在 div 标签中使用 javascript 将 UL 添加到 HTML 时被捕获并出错
- python - 将Python中十六进制格式的字符串正确转换为二进制数据
- sequence - IBM BPM 8.5 按自定义顺序的多实例序列流