質問

ドキュメント

サンプルコードを次に示します

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 ([)
役に立ちましたか?

解決

使用しようとしている構文は、 ElementTree 1.3 の新機能です。

このようなバージョンには、 Python 2.7 以上が付属しています。 Python 2.6以下を使用している場合、ElementTree 1.2.6以下を使用できます。

他のヒント

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

  1. PythonのビルトインElementTree(略してET)には、実際のXPATHサポートがありません。限られたサブセットのみ例では、 // target のような root-from-root 式をサポートしていません。

    注意:ドキュメント &quot; // &quot;に言及していますが、それは子供向けです。 .// target は有効です。 // ... は違います!

    代替実装があります: lxml の方が豊富です。ビルドインコードにドキュメントが使用されるのは継ぎ目です。一致しません/動作しません。

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

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

ビルトインElementTree(v1.3)でルートに解析された特定のドキュメントでは、次のコードが正しく機能しています:

  • root.findall(&quot; .// target&quot;)両方のターゲットを検索
  • root.findall(&quot; .// target / a&quot;) 2つのa要素を検索
  • root.findall(&quot; .// target [a]&quot;)これにより、両方のターゲット要素が再び検出されます。両方にa要素があります
  • root.findall(&quot; .// target [@ name = '1']&quot;) first ターゲットのみを検索します。 1前後の引用符が必要であることに注意してください。それ以外の場合は、SyntaxErrorが発生します
  • root.findall(&quot; .// target [a] [@ name = '1']&quot;)も有効です。そのターゲットを見つける
  • root.findall(&quot; .// target [@ name = '1'] / a&quot;) a要素を1つだけ検索します。 ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top