ElementTree XPath- 속성을 기반으로 요소를 선택하십시오
-
03-07-2019 - |
문제
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 이하가 있습니다.
다른 팁
이 코드에는 몇 가지 문제가 있습니다.
Python의 Buildin Entempertree (ET for Short)에는 실제 XPath 지원이 없습니다. 예제별로 제한된 하위 집합 만 지원하지 않습니다. 뿌리를 찾았습니다 같은 표현
//target
.주목 : 선적 서류 비치언급 "//",하지만 어린이를위한 것만 : 그래서 표현
.//target
유효합니다.//...
아니다!대체 구현이 있습니다. LXML 더 풍부합니다. 빌드 인 코드에 문서가 사용 된 이음새입니다. 그것은 일치/작동하지 않습니다.
그만큼
@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 요소 만 찾습니다. ...
제휴하지 않습니다 StackOverflow