使用DOMDocument和XPath访问子div

时间:2010-09-18 04:54:02

标签: php dom screen-scraping

我正在构建一个基本的屏幕抓取器,供个人使用和学习,所以请不要发表评论,例如“你需要请求许可”等。

我尝试访问的数据结构如下:

<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,如果有其他解决方案可能更容易,那么请发布它们。

1 个答案:

答案 0 :(得分:0)

您可以通过注册PHP函数将一些功能导入DOMXPath,但AFAIK只限于返回标量或节点集。

您可以使用XSLTProcessor::transformToDoc()使用简单的样式表对其进行转换,可能会将其导出为SimpleXML以便于访问。问题是它是否比手动搜索每个类更快。

您当然可以使用//div[contains(@class, 'event') or contains(@class, 'date')]等缩短您的XPath使用率。