46

ElementTreeで属性XPathSelectorを使用するのに問題があります。これは、ドキュメントに従って実行できるはずです。

ここにいくつかのサンプルコードがあります

XML

<root>
 <target name="1">
    <a></a>
    <b></b>
 </target>
 <target name="2">
    <a></a>
    <b></b>
 </target>
</root>

Python

def parse(document):
    root = et.parse(document)
    for target in root.findall("//target[@name='a']"):
        print target._children

次の例外が発生します。

expected path separator ([)
4

2 に答える 2

36

使用しようとしている構文は、ElementTree 1.3で新しく追加されました。

このようなバージョンは、 Python 2.7以降に同梱されています。Python 2.6 以下を使用している場合でも、ElementTree は 1.2.6 以下です。

于 2008-10-21T16:16:06.230 に答える
29

このコードにはいくつかの問題があります。

  1. Python のビルドイン ElementTree (略して ET) には、実際の XPATH サポートはありません。限定されたサブセットのみ たとえば、 のようなルートから検索する式はサポートされていませ//target

    注意:ドキュメント には " // " が記載されていますが、これは子に対してのみです: したがって、式 as .//targetは有効です。//...ではありません!

    代替の実装があります:よりリッチなlxmlです。組み込みコードにドキュメントが使用されているのは継ぎ目です。それは一致しません/機能しません。

  2. @name表記は xml-attributes を選択しますkey=valuexml タグ内の式。

    そのため、指定されたドキュメントで何かを選択するには、name-value を 1 または 2 にする必要があります。または、子要素 'a' : target[a](@ なし)でターゲットを検索できます。

組み込みの ElementTree (v1.3) を使用してルートに解析された特定のドキュメントの場合、次のコードは正しく、機能しています。

  • root.findall(".//target") 両方のターゲットを見つける
  • root.findall(".//target/a") 2 つの a 要素を見つける
  • root.findall(".//target[a]")どちらも a 要素を持っているため、これにより、両方のターゲット要素が再び検出されます。
  • root.findall(".//target[@name='1']")最初のターゲットのみを検索します。1 を囲む引用符が必要であることに注意してください。それ以外の場合は SyntaxError が発生します
  • root.findall(".//target[a][@name='1']")また有効です。そのターゲットを見つけるために
  • root.findall(".//target[@name='1']/a")a 要素を 1 つだけ検索します。...
于 2013-04-19T13:00:16.117 に答える