我安装了一个JSON插件,并获得了HTML页面的内容。现在我想解析并找到一个特定的表,它只有类,但没有id。我使用PHP类DOMDocument来解析它。我想在表之前访问标记,然后以某种方式使用DOMDocument访问下面的下一个标记(我的表)。示例:
<a name="Telefonliste" id="Telefonliste"></a>
<table class="wikitable">
所以,我先得到<a>
,然后得到<table>
。
我已经使用以下命令得到了所有的表,尤其是getElementsByTagName()
。之后,我可以访问我的表所在的项目(2):
$dom = new DOMDocument();
//load html source
$html = $dom->loadHTML($myHtml);
//discard white space
$dom->preserveWhiteSpace = false;
//the table by its tag name
$table = $dom->getElementsByTagName('table');
$rows = $table->item(2)->getElementsByTagName('tr');
这种方式是可以的,但我想让它更通用,因为现在我知道表位于项目(2)中,但位置可以更改,例如,如果在我的表之前的HTML页面中包含一个新表。我的表将不在项目(2)中,而是在项目(3)中。所以,我希望它以一种我仍然可以在不更改代码的情况下访问这个表的方式进行解析。我可以使用DOMDocument作为DOM解析器吗?
您可以使用DOMXPath,并根据需要使表达式通用。
例如:
$dom = new DOMDocument();
//discard white space
$dom->preserveWhiteSpace = false;
//load html source
$dom->loadHTML($myHtml);
$domxpath = new DOMXPath($dom);
$table = $domxpath->query('//table[@class="wikitable" and not(@id)][0]')->item(0);
$elementBeforeTable = $table->previousSibling;
$rows = $table->getElementsByTagName('tr');
我已经开始为web抓取编写一个简单的扩展。我还没有完全按照我想要的方向去做,但你可以看到一个例子,说明如何在搜索响应中恢复原始HTML,而不仅仅是原始文本。
https://github.com/WolfeDev/PageScraper
编辑:我计划很快实现基本的表解析。