1

domDocumentを使用しています。私は近くにいますが、最後の少しのために助けが必要です

このhtmlは以下のスニペットです。いくつかの行があります。hrefを取得しようとしています。

これまでのところ、私は次のことを行っています。テーブル、tr、およびtd okを取得できますが、そこから何をすべきかわかりません。

助けてくれてありがとう

foreach ($dom->getElementsByTagName('table') as $tableitem) {
    if ( $tableitem->getAttribute('class') == 'tableStyle02'){
        $rows = $tableitem->getElementsByTagName('tr');
        foreach ($rows as $row){ 
            $cols = $row->getElementsByTagName('td'); 

            $hrefs = $cols->item(0)->getElementsByTagName('a'); 
        }     
    }
}

htmlスニペット:

<table width="100%" border="0" cellspacing="0" cellpadding="2" class="tableStyle02"> 
    <tr> 
        <td><span class="Name"><a href="bin.php?cid=703&size=0">
               <strong>Conference Facility</strong></a></span></td>
        <td align="center" nowrap>0.00</td>
        <td align="center">&nbsp;0&nbsp;</td>
        <td align="center">&nbsp;&nbsp;</td>
        <td align="center">&nbsp;0&nbsp;</td>
        <td align="center">&nbsp;0&nbsp;</td>
        <td align="center">&nbsp;0 - 0 &nbsp;</td>
        <td align="center">&nbsp;Wired Internet,&nbsp;&nbsp;&nbsp;</td>
        <td align="center">&nbsp;&nbsp;</td>
    </tr>
4

3 に答える 3

3

DomDocumentsのクエリ言語であるxpathの概念を紹介します。

//table[@class="tableStyle02"]//a/@href

読み取り:クラス属性tableStyle02を持つtableタグを取得し、次に子タグ内からhref属性を取得します。

または、foreachfortrtdelementsもあるように:

//table[@class="tableStyle02"]/tr/td/a/@href

このパスでは、タグはtdタグの直接の子であり、trタグの直接の子であり、tableタグの直接の子です。ご覧のとおり、xpathを使用すると、すべてをPHPコードで記述するよりも、要素へのパスを作成する方がはるかに簡単です。

適切なPHPコード、PHPではこれ次のようになります。

$doc = new DOMDocument();
$doc->loadHTML($html);
$xp = new DOMXPath($doc);
$href = $xp->evaluate('string(//table[@class="tableStyle02"]//a/@href)');

この場合、変数$hrefには次の文字列が含まれますbin.php?cid=703&size=0


この例では文字列(string(...))を使用しているため->evaluate、最初に見つかった属性ノードから作成された文字列を返します。代わりに、ノードリストを返すこともできます。

$hrefs = $xp->query('//table[@class="tableStyle02"]/tr/td/span/a/@href');
#             ^^^^^                                       ^^^^

$hrefsこれで通常のが含まれ、ここDOMNodeListにはすべてのhref属性ノードが含まれます。

echo $hrefs->item(0)->nodeValue; # bin.php?cid=703&size=0

タグを区切るためにスラッシュを1つだけ使用する場合は/、それらが直接の子である必要があることに注意してください。2つのスラッシュ//を使用すると、子孫(子または子の子(子(の...)))にすることができます。

于 2012-07-21T16:12:03.097 に答える
1

個々のDOMElementインスタンスでgetAttribute()を使用できるはずです(例の2行目で使用したのと同じです)。

foreach ($hrefs as $a_node) {
    if ($a_node->hasAttribute('href')) {
        print $a_node->getAttribute('href');
    }
}
于 2012-07-21T16:10:33.040 に答える
1

使用するためにDOM階層を下に移動する必要はありませんgetElementsByTagName

foreach ($dom->getElementsByTagName('table') as $tableitem) {
    if ($tableitem->getAttribute('class') == 'tableStyle02'){
        $links = $tableitem->getElementsByTagName("a");
    }
}

$linksこの時点ではになっているDOMNodeListので、次のように繰り返すことができます。

foreach ($dom->getElementsByTagName('table') as $tableitem) {
    if ($tableitem->getAttribute('class') == 'tableStyle02'){
        $links = $tableitem->getElementsByTagName("a");
        $hrefs = array();
        foreach ($links as $link) {
            $hrefs[] = $link->getAttribute("href");
        }
    }
}
// Do things with $hrefs
于 2012-07-21T16:11:34.800 に答える