2012-12-20 3 views
2

XPATH에 대한 이해를 높이려고합니다. 나는 많은 요소를 가진 문서를 가지고있다. 굵게 표시된 특정 텍스트가있는 문서 내의 글꼴 요소를 찾고 있습니다.LXML의 XPATH를 사용하여 특성을 기반으로 특정 요소를 지정하는 방법

다음은 div 요소 내부의 글꼴 요소의 예입니다. 글꼴 요소에 굵게 표시하려는 텍스트가 있습니다.

<div style="line-height:120%;padding-bottom:10px;padding-top:10px;font-size:10pt;"><font style="font-family:inherit;font-size:10pt;font-weight:bold;">SECTION 1.&nbsp;&nbsp;&nbsp;&nbsp;Executive&nbsp;Summary</font></div> 

훨씬 더 큰 문서의 일부입니다. 내가 XPATH 튜토리얼을 발견하고 그냥 확실히 내가 가진 문제로 실행하고 있지 않다하기 위해 특정 요소

을 선택하는 방법을 설명 나는이 x는 3023 개 요소가로 일

tree=html.fromstring(open('c:\\mytest.htm') 

x=tree.xpath('//font') 

파일을 읽고있다 어떻게 내가 그 (것)들을 조사 할 때 나는 그들이 글꼴 성분 전부다는 것을 것을을 발견했다. 일부는 내가 원하는 요소였습니다.

나는 다음 my_elements가 비어대로 작동하지 않았다

my_elements = tree.xpath('//font[@font-weight='bold']') 

를 사용하여 관련 요소를 분리하기 위해 노력했다. 이 질문을 쓰는 동안 나는 html의 싹둑을 더 가까이에서 보았고 유휴 상태에서 놀았습니다. 문제는 글꼴 태그 font-weight의 속성이 없다는 것입니다. 폰트 가중치는 스타일 속성과 관련이 있습니다.이 예에서 글꼴 태그의 유일한 속성은 스타일입니다. 나는 더 많이 말하고 싶지만 물을 너무 많이 진흙에 묻히게 될까 봐 두렵다.

결론 나는 xpath를 사용하여 굵은 글꼴 요소를 찾고 텍스트에서 단어 섹션을 찾을 수 있기를 원한다. 엘리먼트를 반복하고 정말로 clunky 한 방식으로 테스트한다.

my_elements = [e for e in tree.iter() if e.tag == 'font' if 'bold' in e.values()[0] ] 
my_elements = e for e in my_elements if 'section' in e.text_content().lower() 

XPATH는 이해할 만하다.

설명해 주셔서 감사합니다.

HUMM 나는 마침내 이제 궤도에

testelem=tree.xpath('//font[contains(@style,"font-weight:bold")]') 

괜찮 오전 우리는

이제
testelem=tree.xpath('//font[contains(@style,"font-weight:bold") and contains(text(),"SECTION")]') 

는 대소 문자를 구분하지

내가 이해에 가까운 얻고 그것을 만들기 위해 및 연산자를 사용 어떻게 작동합니까?하지만 해결책을 제시하는 사람에게는 행복합니다.

testelem=tree.xpath('//font[contains(@style,"font-weight:bold") and starts-with(translate(text(),"SECTION","section"),"section")]') 
+0

당신이 * 굵게 * 주위에 당신의 따옴표를 이스케이프 안 : 기본적으로 XPath는이 EXSLT 네임 스페이스에서 정규 표현식을 지원? 'my_elements = tree.xpath ('font = @ font-weight ='bold ']')', – toniedzwiedz

+0

다른 곳에서 본 인터프리터와 예제에서 볼 수있는 것이 아닙니다. – PyNEwbie

+0

답변을 얻은 것 같습니다. 우리가 그것을 upvote 수 있도록 아래에 게시하는 방법에 대해? – unutbu

답변

3

그냥이 게시물이> 2 세처럼, 어쨌든 나는이 대답이이 질문에 오는 사람을 도울 수 있기를 바랍니다.

xpath에서 regular expressionlxml에서 사용할 수 있습니다.

testelem = tree.xpath('//font[re:match(text(), \ 
         "^(?i)section.*") and \ 
         contains(@style, "font-weight:bold")]', 
         namespaces={'re': "http://exslt.org/regular-expressions"}) 

print testelem 
[<Element font at 0x1042f49f0>] 

for t in testelem: 
    print t.text, t.attrib 

SECTION 1. Executive Summary {'style': 'font-family:inherit;font-size:10pt;font-weight:bold;'} 
관련 문제