문제

ElementTree의 XPath 선택기 속성을 사용하는 데 어려움이 있습니다. 선적 서류 비치

다음은 샘플 코드입니다

XML

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

파이썬

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

다음과 같은 예외를 받고 있습니다.

expected path separator ([)
도움이 되었습니까?

해결책

당신이 사용하려는 구문은 새로운 것입니다 요소 1.3.

이러한 버전은 함께 배송됩니다 파이썬 2.7 또는 더 높게. Python 2.6 이하 인 경우 여전히 ElementTree 1.2.6 이하가 있습니다.

다른 팁

이 코드에는 몇 가지 문제가 있습니다.

  1. Python의 Buildin Entempertree (ET for Short)에는 실제 XPath 지원이 없습니다. 예제별로 제한된 하위 집합 만 지원하지 않습니다. 뿌리를 찾았습니다 같은 표현 //target.

    주목 : 선적 서류 비치언급 "//",하지만 어린이를위한 것만 : 그래서 표현.//target 유효합니다. //... 아니다!

    대체 구현이 있습니다. LXML 더 풍부합니다. 빌드 인 코드에 문서가 사용 된 이음새입니다. 그것은 일치/작동하지 않습니다.

  2. 그만큼 @name 표기법 xml-를 선택합니다.속성; 그만큼 key=value XML- 태그 내의 발현.

    따라서 주어진 문서에서 무언가를 선택하려면 1 또는 2 여야합니다. 또는 아이와 함께 목표를 검색 할 수 있습니다. 요소 'ㅏ': target[a] (아니요 @).

주어진 문서의 경우, 빌드 인 ElementTree (v1.3)를 루트로 구문 분석하면 다음 코드가 정확하고 작동합니다.

  • root.findall(".//target") 두 대상을 모두 찾으십시오
  • root.findall(".//target/a") 두 개의 A- 요소를 찾으십시오
  • root.findall(".//target[a]") 이것은 A- 요소가 있기 때문에 두 가지 목표 요소를 다시 찾습니다.
  • root.findall(".//target[@name='1']") 만 찾으십시오 첫 번째 표적. 약 1 약 1 인용이 필요합니다. 그렇지 않으면 구문이 제기됩니다
  • root.findall(".//target[a][@name='1']") 또한 유효합니다. 그 목표를 찾기 위해
  • root.findall(".//target[@name='1']/a") 하나의 A 요소 만 찾습니다. ...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top