아래처럼 xpath 를 사용해서 원하는 element 를 가져올 수 있다. lxml 사용하기
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(), "벚꽃 엔딩")]')
아래와 같은 page 가 있을 때 xpath 예제
<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]
<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()
댓글 없음:
댓글 쓰기