1

このhtmlは私のページ内にあります:

<tr>
    <td class="padded2" bgcolor="#103A74"><font color="White">Refine by Vehicle Types</font></td>
    </tr><tr>
        <td class="padded2" bgcolor="White"><div>
            <table border="0">
                <tr>
                    <td class="padded2"><font color="#103A74"><ul><li><a class="padded2"> Cars</a></li><li><a class="padded2">Marine Engines</a></li><li><a class="padded2">Trucks</a></li></ul></font></td>
                </tr>
            </table>
        </div></td>
</tr>

「Cars」と「Trucks」は「Refine by Vehicle Type」の後であるという事実に基づいてスクレイピングしたいと考えています。私は多くの異なる方法を試しましたが、これは私が得ることができる限り近いものですが、NULL を返します。

$Nodes = $xPath->query("//tr/td/font[text()[contains(., 'Refine by Vehicle Type')]]/following-sibling::tr/td/div/table/tr/td/font/ul/li/a")->item(0)->nodeValue;

私は何が欠けていますか?

4

1 に答える 1

2

あなたのエラーはこれにあります

...font[...]/following-sibling::tr/...

<font>提供された XML フラグメントでは、要素に兄弟要素がないことが簡単にわかります。

以下は、正しい XPath 式の 1 つです

  tr[td[contains(., 'Refine by Vehicle Types')]]
      /following-sibling::tr
        /td/div/table
                 /tr/td/font
                         /ul/li/a

次の XML ドキュメント(提供されたフラグメントを でラップ<table>) に対して評価した場合:

<table>
    <tr>
        <td class="padded2" bgcolor="#103A74">
            <font color="White">Refine by Vehicle Types</font>
        </td>
    </tr>
    <tr>
        <td class="padded2" bgcolor="White">
            <div>
                <table border="0">
                    <tr>
                        <td class="padded2">
                            <font color="#103A74">
                                <ul>
                                    <li>
                                        <a class="padded2"> Cars</a>
                                    </li>
                                    <li>
                                        <a class="padded2">Marine Engines</a>
                                    </li>
                                    <li>
                                        <a class="padded2">Trucks</a>
                                    </li>
                                </ul>
                            </font>
                        </td>
                    </tr>
                </table>
            </div>
        </td>
    </tr>
</table>

次の要素が選択されています:

<a class="padded2"> Cars</a>
<a class="padded2">Marine Engines</a>
<a class="padded2">Trucks</a>

XSLT ベースの検証:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:copy-of select=
  "tr[td[contains(., 'Refine by Vehicle Types')]]
      /following-sibling::tr
        /td/div/table
                 /tr/td/font
                         /ul/li/a
  "/>
 </xsl:template>
</xsl:stylesheet>

この変換が上記の XML ドキュメントに適用されると、選択された要素が出力されます

<a class="padded2"> Cars</a>
<a class="padded2">Marine Engines</a>
<a class="padded2">Trucks</a>

XPath ビジュアライザーを使用して、正確で洗練された XPath 式をすばやく作成することをお勧めします。

于 2011-10-02T03:04:25.457 に答える