我正在构建一个基本的屏幕抓取器,供个人使用和学习,所以请不要发表评论,例如“你需要请求许可”等。
我尝试访问的数据结构如下:
<tr>
<td>
<div class="wrapper">
<div class="randomDiv">
<div class="divContent">
<div class="event">asd</div>
<div class="date">asd</div>
<div class="venue">asd</div>
<div class="state">asd</div>
</div>
</div>
</div>
</td>
</tr>
我正在尝试收集所有这些数据(因为给定页面上大约有20行)。
使用以下代码我设法收集了我需要的数据:
$remote = file_get_contents("linktoURL");
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$file = @$doc->loadHTML($remote);
$rows = $doc->getElementsByTagName('tr');
$xp = new DOMXpath($doc);
//initialize variables
$rows = array();
foreach($xp->query('//*[contains(@class, \'wrapper\')]', $doc) as $found) {
echo "<pre>";
print_r($found->nodeValue);
}
现在我的问题是,如何将所有这些数据存储到一个关联数组中,如下所示:
Array (
[0] => Array
(
[Event] => Name
[Date] => 12/12/12
[Venue] => NameOfPlace
[state] => state
)
[1] => Array
(
[Event] => Name
[Date] => 12/12/12
[Venue] => NameOfPlace
[state] => state
)
[2] => Array
(
[Event] => Name
[Date] => 12/12/12
[Venue] => NameOfPlace
[state] => state
)
)
现在,我想到的唯一解决方案是在foreach循环中为每个类名//*[contains(@class, \'className\')]
调用xpath查询。
通过DOMDocument和XPath是否有更惯用的方法,我能够创建上述数据的关联数组?
修改
我不仅限于使用DOMDocument和XPath,如果有其他解决方案可能更容易,那么请发布它们。
答案 0 :(得分:0)
您可以通过注册PHP函数将一些功能导入DOMXPath,但AFAIK只限于返回标量或节点集。
您可以使用XSLTProcessor::transformToDoc()
使用简单的样式表对其进行转换,可能会将其导出为SimpleXML以便于访问。问题是它是否比手动搜索每个类更快。
您当然可以使用//div[contains(@class, 'event') or contains(@class, 'date')]
等缩短您的XPath使用率。