0

ほとんどテーブルベースのウェブサイトをスクレイピングしています。それぞれ<tr>がカテゴリを表すタグと、その<td>中にカテゴリのプロパティを表すタグがあります。

Xpath を使用すると問題は解決し<tr>ますが、その中のすべての<td>情報が 1 つの文字列としてまとめられています。

$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 情報から配列を作成するにはどうすればよいでしょうか。例: train[1][2]?

4

1 に答える 1

1

あなたの 2 回目の試みは正しい方向にあります。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 に答える