0

次の行を含む HTML テーブルがあるとします。

...
<tr>
  <th title="Library of Quintessential Memes">LQM:</th>
  <td>
    <a href="docs/lqm.html"><b>Intro</b></a>
    <a href="P/P79/">79</a>
    <a href="P/P80/">80</a>
    <a href="P/P81/">81</a>
    <a href="P/P82/">82</a>
  </td>
</tr>
<tr>
  <th title="Library of Boring Books">LBB:</th>
  <td>
    <a href="docs/lbb.html"><b>Intro</b></a>
    <a href="R/R80/">80</a>
    <a href="R/R81/">81</a>
    <a href="R/R82/">82</a>
    <a href="R/R83/">83</a>
    <a href="R/R84/">84</a>
  </td>
</tr>
...

関連するのテキストが固定タイトルの小さなセット (LQM、LBR、RTT など) に<a>ある要素内のすべての要素を選択したいと考えています。これを XPath クエリとして作成するにはどうすればよいですか?<td><th>

編集: 私は Python スクレイピング ツールキットである Scrapy を使用しているため、このクエリを小さなクエリのセットとして表現する方が簡単であれば、喜んでそれを使用します。たとえば、<tr>最初の<th>子が正規表現に一致するすべての要素を選択できれば<a>、残りの<tr>要素のすべての子孫を選択できれば素晴らしいでしょう。

4

1 に答える 1

3

次の XPath が機能します。

//a[contains(',LQM:,LBR:,RTT:,',
             concat(',', ancestor::td/preceding-sibling::th, ','))]

これにより、理論的には誤検知が発生する可能性があります (コードにコンマが含まれている場合)。

より厳密に言うと、次のようになります。

//a[ancestor::td/preceding-sibling::th[.='LQM:']]
|//a[ancestor::td/preceding-sibling::th[.='LBR:']]
|//a[ancestor::td/preceding-sibling::th[.='RTT:']]

入力の周りにタグを追加<table>し、次の XSL 変換を適用して、これをテストしました。

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:for-each select="//a[ancestor::td/preceding-sibling::th[.='LQM:']]
                                  |//a[ancestor::td/preceding-sibling::th[.='LBR:']]
                                  |//a[ancestor::td/preceding-sibling::th[.='RTT:']]">
            <xsl:text>
</xsl:text>
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>

</xsl:transform>

次の出力が生成されます。

<a href="docs/lqm.html"><b>Intro</b></a>
<a href="P/P79/">79</a>
<a href="P/P80/">80</a>
<a href="P/P81/">81</a>
<a href="P/P82/">82</a>

もちろん、XSL を使用している場合は、この構造の方が読みやすいかもしれません。

<xsl:for-each select="//a">
    <xsl:variable name="header" select="ancestor::td/preceding-sibling::th"/>

    <xsl:if test="$header='LQM:' or $header = 'LBR:' or $header = 'RTT:'">
        <xsl:text>
        </xsl:text>
        <xsl:copy-of select="."/>

    </xsl:if>
</xsl:for-each>
于 2012-10-23T16:00:28.377 に答える