2012-01-03 4 views
2

html 코드는 숨김이며 html에 "PRICE"문자열을 포함합니다. 이 부분 문자열은 html 텍스트와 일치해야합니다. xpath를 사용하여 텍스트가 일치하면 (부분 일치) 특정 html 태그 경로를 반환해야합니다.xpath를 사용하여 부분 문자열 일치 html 태그 가져 오기

참고 :

html="""<div id = "price_id"> 
    <span id = "id1"></span> 
    <div class="price_class"> 
    <bold> 
    <strong> 
    <label>PRICE:</label> 125 Rs. 
    </bold> 
    </strong> 
    </br> 
    </br> 

</div>""" 
:
나는이 예입니다

(부모 태그를 가져 오기, "가격"을 찾기위한) 여러 sites.I는 일반 규칙 를 사용해야한다이 논리를 자동화해야

나는이 XPath 식을 사용하여 작성 될 어떻게

from lxml.html.clean import Cleaner  

cleaner =Cleaner(page_structure=False) 
cl = cleaner.clean_html(html) 
cleaned_html = fromstring(cl) 

for element in cleaned_html: 
     if element.text == 'PRICE': 
      print "matched" 

LXML 사용?

xpath 표현식을 사용하여 div 클래스 경로를 얻어야합니다.

또한 문제는 "PRICE :"문자열을 찾는 경우입니다. 부모 유효 태그은 클래스 이름이 "price_class"인 "div"이어야합니다. 그러나 여기 내가 에이 건너 뛰거나 원하지 않는 태그를 글꼴, 굵게, 기울임 꼴과 같은을 제거해야 ...

당신은 위치 문자열의 부모 유효한 태그를 얻기 위해 나에게 제안시겠습니까?

답변

2

당신은 ancestor 축을 사용할 수 있습니다

import lxml 

html = ... 
doc = lxml.html.fromstring(html) 

for element in doc.xpath('//label[contains(text(), "PRICE:")]/ancestor::div[@class="price_class"]'): 
    print 'Found %s: %s' % (element.tag, element.text_content().strip()) 

출력 :

Found div: PRICE: 125 Rs. 

편집 : 그것은으로 요소를 검색합니다

doc.xpath('//*[contains(text(), "PRICE:")]/\ 
      ancestor::*[not(self::strong|self::bold|self::italic)][1]') 

: 수정 질문에 대한보다 일반적인 솔루션 텍스트 "PRICE:" 첫 번째 조상을 strong, bold, italic으로 건너 뛰기를 선택하십시오. 제외 목록에 태그를 더 추가 할 수 있습니다.

대신 (같은 div, ul 등) 먼저 좋은 조상을 검색 할 수 있습니다 목록에서 제외 :

doc.xpath('//*[contains(text(), "PRICE:")]/ancestor::*[self::div|self::ul][1]') 
+0

여기 HTML 소스 코드를 볼 수 없습니다. 따라서 속성과 태그를 수동으로 사용할 수 없습니다. 다른 사이트에서는 태그와 클래스가 다양 할 것입니다. 많은 사이트에서이 논리를 자동화해야합니다. 대신에 (label, price_class)를 언급하는 대신에 일반 규칙 – Nava

+0

@ saravana를 사용해야 할 수도 있습니다. 대답에 대한보다 일반적인 해결책이 추가되었습니다. – reclosedev

+0

고마워하는 친구 :-) 한 가지 의심의 여지가 있습니다. 텍스트를 대문자로 변환해야합니다(). 나는 대문자 (text()) 'price'를 시도했다. 그러나 – Nava

0

난 그냥 XPath 식을 사용하여 DIV 클래스 경로를 얻을 필요가있다.

사용 : 문자열 :

//*[contains(text(), 'PRICE')]/ancestor::div[1]/@class 

또한 문제는 내가 "가격"을 찾을 경우입니다. 나는 클래스 이름이 "price_class"인 "div"인 부모 유효한 태그를 가져야한다. 하지만 여기 나는 건너 뛰거나 글꼴, 굵게, 기울임 꼴과 같은 원치 않는 태그를 제거해야합니다 ...

XPath는 XML 문서의 쿼리 언어입니다. 따라서 XML 문서의 구조를 수정할 수 없습니다. 이렇게하려면 다른 언어 (즉, XPath 호스팅)를 사용해야합니다.

XSLT는 특히 XML 문서의 변환을 수행하는 데 가장 적합한 언어입니다.

관련 문제