7

lower-caseXPath の関数を使用して国または国を照合しようとしています。translateはちょっと面倒なので、小文字を使用すると、私の Python バージョン 2.6.6 は XPath 2.0 をサポートしています。小文字は XPath 2.0 でしか使用できないためです。

私の場合に小文字を使用する方法は、私が探しているものです。例が自明であることを願っています。出力として探して['USA', 'US']います(小文字が国と国を同じであると評価した場合に発生する可能性のある両方の国を一度に)。

HTML: doc.htm

<html>
    <table>
        <tr>
            <td>
                Name of the Country : <span> USA </span>
            </td>
        </tr>
        <tr>
            <td>
                Name of the country : <span> UK </span>
            </td>
        </tr>
</table>

パイソン:

import lxml.html as lh

doc = open('doc.htm', 'r')
out = lh.parse(doc)
doc.close()

print out.xpath('//table/tr/td[text()[contains(. , "Country")]]/span/text()')
# Prints : [' USA ']
print out.xpath('//table/tr/td[text()[contains(. , "country")]]/span/text()')
# Prints : [' UK ']

print out.xpath('//table/tr/td[lower-case(text())[contains(. , "country")]]/span/text()')
# Prints : [<Element td at 0x15db2710>]

アップデート :

out.xpath('//table/tr/td[text()[contains(translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz") , "country")]]/span/text()')

ここで疑問が残ります。翻訳部分をグローバル変数 'handlecase' として保存し、XPath を実行するたびにそのグローバル変数を出力できますか?

このような作品:

handlecase = """translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")"""

out.xpath('//table/tr/td[text()[contains(%s , "country")]]/span/text()' % (handlecase))

しかし、単純さと読みやすさのために、次のように実行したいと思います。

out.xpath('//table/tr/td[text()[contains(handlecase , "country")]]/span/text()')
4

2 に答える 2

5

必要なものを取得する最も簡単な方法は、XPath 拡張関数を作成することだと思います。

これを行うことで、lower-case()関数または大文字と小文字を区別しない検索を作成できます。


詳細はこちら: http://lxml.de/extensions.html

于 2012-06-27T18:23:21.023 に答える
3

使用:

   //td[translate(substring(text()[1], string-length(text()[1]) - 9),
                  'COUNTRY :',
                  'country'
                  )
        =
         'country'
       ]
        /span/text()

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=
  "//td[translate(substring(text()[1], string-length(text()[1]) - 9),
                  'COUNTRY :',
                  'country'
                  )
        =
         'country'
       ]
        /span/text()
       "/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<html>
        <table>
            <tr>
                <td>
                    Name of the Country : <span> USA </span>
                </td>
            </tr>
            <tr>
                <td>
                    Name of the country : <span> UK </span>
                </td>
            </tr>
        </table>
</html>

XPath 式が評価され、選択された 2 つのテキスト ノードが出力にコピーされます。

 USA  UK 

説明:

  1. XPath 2.0 標準関数を実装する XPath 1.0 式の特定のバリアントを使用しますends-with($text, $s)。これは次のとおりです。

.....

$s = substring($text, string-length($text) - string-length($s) +1)

.2. 次のステップでは、このtranslate()関数を使用して、末尾の 10 文字の長い文字列を小文字に変換し、スペースや ":" 文字を削除します。

.3. 結果が文字列 (すべて小文字) の "country" の場合、 this の s=span子の子テキスト ノード (この場合は 1 つだけ) を選択しますtd

于 2012-06-28T04:09:41.207 に答える