[컴][파이썬] lxml 사용하기






lxml 사용하기

아래처럼 xpath 를 사용해서 원하는 element 를 가져올 수 있다.
 from lxml import etree
 from io import StringIO
 ...
 content = '<html><head> ....</head>'
 parser = etree.HTMLParser()
 tree   = etree.parse(StringIO(content), parser)
 atags = tree.xpath('//a[contains(text(), "벚꽃 엔딩")]')
 spans = atags[0].xpath('.//span[contains(text(), "벚꽃 엔딩")]')

xpath 예제

아래와 같은 page 가 있을 때

 <tr>
  <div>
   <a href='...' class='song'>벚꽃 엔딩</a>
   <a href='...' class='song sky'>엔드</a>
   <a href='...' class='test_song sky'>엔드2</a>
  </div>
 </tr>
 <tr>
  ...
 </tr>

a-tag 를 추출한다면 아래같은 code 를 사용하면 된다.
 # 벛꽃 엔딩이라는 text 를 가지고 있는 a-tag
 '//a[contains(text(), "벚꽃 엔딩")]'

특정 element 를 가져온 후에 다시 그 element 에서 xpath 로 그 하위 element 를 찾을 수 있다. 이때는 xpath 의 시작을 ‘.’ 로 해야 한다. 그렇지 않으면, root element 에서 찾기 시작한다.
 atags = tree.xpath('//a[contains(text(), "벚꽃 엔딩")]')
 spans = atags[0].xpath('.//span[contains(text(), "벚꽃 엔딩")]')


특정 a-tag 를 가진 tr-tag 를 가져오고 싶다면 아래처럼 ancestor 를 이용하면 된다.

 # 벛꽃 엔딩이라는 text 를 가지고 있는 a-tag
 '//a[contains(text(), "벚꽃 엔딩")]/ancestor::tr'


class 에 song 이 있는 모든 a-tag 를 가져올때는 contains 를 사용하면 된다. 하지만 이경우에 test_song 같은 class 도 같이 가져온다.

 //a[contains(@class, "song")]


class 가 “song” 인 a-tag 를 가져올때, 이경우는 정확히 string 이 일치하는 녀석만 가져온다.

 //a[@class = "song"]


2가지 조건을 넣을 때는 or 을 사용하면 된다.

 .//span[@class="rank" or @class="rank "]


input 의 value 를 가져올때

 //input[@id='TotalPageCount']/@value
 ['25']

attribute 의 값을 가져올 때
customer.xpath('./@NAME')[0]


<p> 안의 br tag 가 섞여있는 text 를 가져오는 방법
sibling 을 traverse 하는 방법(이때는 find/findall 을 써야 한다. xpath 가 return 하는 Element 는 itersiblings 를 가지고 있지 않다.)
<header>test_header</header>
<div><div class="myclass yours">
  <p>text,...<br/> test2....<br/> </p>
</div></div>

for header in tree.findall('//header'):
    if header.text == "test_header":
        for sib in header.itersiblings():
            p = sib.xpath(".//div[contains(@class, 'myclass')]/p")[0]
            summaryText = html.fromstring(html.tostring(p)).text_content()





댓글 없음:

댓글 쓰기