2016-12-18 5 views
1

주어진 XML 파일에서 일부 데이터를 추출하려고합니다. 따라서 속성 값을 사용하여 특정 노드를 선택해야합니다. 내 XML 모양은 다음과 같습니다.xpath로 XML 노드를 선택하십시오. 아포 슬로프가 포함 된 속성 값을 사용합니다.

<?xml version="1.0" encoding="UTF-8" ?> 
<svg ....> 
    .... 
    <g font-family="'BentonSans Medium'" font-size="12"> 
     <text>bla bla bla</text> 
     .... 
    </g> 
    .... 
</svg> 

값에서 아포스트로프를 벗어나려고했지만 작동하지 못했습니다.

from lxml import etree as ET 

tree = ET.parse("file.svg") 
root = tree.getroot() 

xPath = ".//g[@font-family='&apos;BentonSans Medium&apos;]" 
print(root.findall(xPath)) 

난 항상 이런 종류의 오류를 얻을 :

File "C:\Python34\lib\site-packages\lxml\_elementpath.py", line 214, in prepare_predicate 
raise SyntaxError("invalid predicate") 

사람이 어떻게 XPath는 이러한 노드를 선택하는 아이디어를 가지고 있습니까?

답변

0

이 시도 :

xPath = ".//g[@font-family=\"'BentonSans Medium'\"]" 

당신이 닫는 작은 따옴표 넣지 않았기 때문에 코드가 실패

:

xPath = ".//g[@font-family='&apos;BentonSans Medium&apos;]" 

그것은 마지막 &apos; 후에해야한다 :

xPath = ".//g[@font-family='&apos;BentonSans Medium&apos;']" 

하지만 &apos;이 그대로 해석되므로 XPath 식을 올바르게 작성하십시오. 그런데


, 당신은 font-family지정된 문자열을 포함되어있는 경우, 확인 xpath 방법 contains()의 XPath 기능을 사용하려면 :

xPath = '//g[contains(@font-family, "BentonSans Medium")]' 
print(root.xpath(xPath)) 

출력

[<Element g at 0x7f2093612108>] 

샘플 코드는 모두 0123을 가져옵니다. 요소 값이 BentonSans Mediumfont-family 인요소 findall 방법은 contains() 작동하지 않는 이유

는 나도 몰라,하지만 xpath 더 유연한 것, 그리고 내가 대신이 방법을 사용하는 것이 좋습니다 것입니다.

+0

대단히 감사합니다. 귀하의 작은 구문 조정 그것을 했어! – monchi