在PHP中,如何为某个文本模式刮取DOMDocument,然后获取该匹配文本的文本节点的父元素?

时间:2011-03-09 03:59:42

标签: php xml parsing simplexml domdocument

我已经使用PHP和cURL构建了一个简单的Web抓取工具,并且一直使用这样的代码来抓取被抓取页面的某些元素,或者使用Tag Name,其中所需元素上没有ID:< / p>

$dom = new DOMDocument();
@$dom->loadHTML($response);
$table = $dom->getElementsByTagName('table')->item(4);
$response = $dom->saveXML($table);

现在我遇到了一个两难的境地,我需要更进一步找到某个字符串或正则表达式文本模式的父元素,因为我需要从中收集数据的网站没有任何ID或者我需要从中提取数据的HTML元素中的类,并且各种页面可能以不同的方式组织数据,因此我不能总是依赖于表#X中的数据。获取我在此站点之后的数据的唯一确定方法是通过其文本格式查找它,该文本格式始终是以“1”开头的数字列表。它们不使用有序列表,或者它会简单得多。它只是一个简单的表格单元格,数字行由简单的<br>分隔。

所以我在想,如果我能找到“1”,那么它的父元素就是表格单元格<td>,在找到之后,我需要提取其内容,也许还要提取内容。该表行中的任何其他相邻表格单元格。我在页面或HTML代码中找不到“1.”的其他实例,所以这种方法似乎是合理的,如果不是有点hacky,但我离题了。

那么,接近这样的事情的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

您可以随时尝试XPath查询,如下所示(假设您所关注的内容始终位于表格单元格中)

$xpath = new DOMXPath($dom);
$cells = $xpath->query('//table/tr/td[contains(.,"1. ")]');
if ($cells->length > 0) {
    // get first item
    $cell = $cells->item(0);
    echo $cell->nodeValue; // text content only
    echo $dom->saveXML($cell); // <td>1. ... </td>
}