0

我正在抓取一个主要基于表格的网站。我有<tr>标签,每个标签都代表一个类别,其中的<td>标签代表类别的属性。

使用 Xpath 我得到了<tr>很好的结果,但其中的所有<td>信息都集中为一个字符串:

$html_string = file_get_contents('testpage.html');
$dom = new DOMDocument();
$dom->loadHTML($html_string);
$xpath = new DOMXpath($dom);
$context_nodes = $xpath->query('//table[@id="category"]/tr[not(starts-with(@id, "category"))]');

并且每个人都可以<td>很好,但没有回顾性地参考以下类别:

$context_nodes = $xpath->query('//table[@id="category"]/tr[not(starts-with(@id, "category"))]/td');

我以后想做的是能够引用每个类别的属性。我想我可以用 $context_nodes[2] 等来做到这一点,认为它创建的数组是一个多维字符串数组。情况似乎并非如此。

我将如何从 xpath 信息创建一个数组,在该数组中我可以根据识别我特别想要的类别来获取类别的属性。例如火车[1][2]?

4

1 回答 1

1

您的第二次尝试是正确的。PHP(或者,更确切地说,libxml)保留对您选择的节点从其返回的上下文的引用,允许您精确地执行您需要的情况。

XML

<root>
    <cat name="category 1">
        <prop>prop 1.1</prop>
        <prop>prop 1.2</prop>
    </cat>
    <cat name="category 2">
        <prop>prop 2.1</prop>
        <prop>prop 2.2</prop>
    </cat>
</root>

PHP

$xml = new SimpleXMLElement($xml);
$props = $xml->xpath('cat/prop');
foreach($props as $prop) {
    //let's go back up...
    $parent_cat = $prop->xpath('parent::*/@name');
    echo '<p>'.$prop.' (property of '.$parent_cat[0].')</p>';
}

请注意我们如何从节点的点向上导航到树prop以引用父类别。不确定这是否是您的意思,但希望对您有所帮助。

于 2012-06-23T00:20:16.237 回答