본문 바로가기
[업무 지식]/Crawling

[lxml] lxml 기본 사용법 이해

by 에디터 윤슬 2024. 12. 31.
# lxml로 스크레이핑하기

!pip3 install lxml
!pip3 install cssselect

import sys
import ssl
from urllib.request import urlopen

ssl._create_default_https_context = ssl._create_unverified_context
f = urlopen('https://www.hanbit.co.kr/store/books/full_book_list.html')


# HTTP 헤더를 기반으로 인코딩 방식을 추출합니다(명시돼 있지 않을 경우 utf-8을 사용하게 합니다).
encoding = f.info().get_content_charset(failobj="utf-8")
# 인코딩 방식을 표준 오류에 출력합니다.
print('encoding:', encoding, file=sys.stderr)

# 추출한 인코딩 방식으로 디코딩합니다.
text = f.read().decode(encoding)
# 웹 페이지의 내용을 표준 출력에 출력합니다.
print(text)

# HTML 파일로 저장
output_file = 'full_book_list.html'
with open(output_file, 'w', encoding='utf-8') as file:
    file.write(text)

print(f'HTML 파일이 "{output_file}"로 저장되었습니다')

 

›>> import lxml.html
>>> tree = lxml.html.parse('full_book_list.html') # parse() 함수로 파일 경로를 지정할 수 있습니다.

# parse() 함수로 URL을 지정할수도 있지만 추출할 때 미세한 설정을 따로 할 수 없으므로 추천하지 않습니다.
>> tree = lxml.html.parse('http://example.com/')

# 파일 객체를 지정해서 파싱할 수도 있습니다.
>>> from urllib.request import urlopen
›»> tree = lxml.html.parse(urlopen('http://example.com/'))
》 type(tree) # 파싱하면 ElementTree 객체가 추출됩니다.

<class 'lxml.etree._ElementTree'>
》 html = tree.getroot() * getroot() 메서드로 html 루트 요소의 HtmlElement 객체를 추출할 수 있
습니다.
>> type(html)
<class 'lxml.html.HtmlElement'>

# fromstring() 함수로 문자열(Str 자료형 또는 bytes 자료형)을 파싱할 수 있습니다.
# 참고로 encoding이 지정된 XML 선언을 포함한 Str을 파싱하면 ValueError가 발생하므로 주의하기 바랍니다.
»> html = lxml.html.fromstring('''
... (html>
... 〈head><title>온라인 과일 가게〈/title〉/head〉
... (body>
... <h1 id="main">오늘의 과일</h1>
... <ul>
...		<li>사과</li>
...		<li class="featured">귤</li>
...		<li>포도(/li)
... </ul> 
... </body>
.. </html>''')
>》 type(html) # fromstring() 함수로 직접 HtmlElement 객체를 추출할 수 있습니다.
<class 'lxml.html.HtmlElement'>

>>> html.xpath('//li') * HtmLElement의 xpath() 메서드로 xPath와 일치하는 요소 목록을 추출할 수 있습
니다.
[<Element li at 0x1061825e8>, <Element li at 0x1081C14a8>, <Element li at 0x108869728>]

>>> html.csselect('li') # HtmlElement의 cssselect() 메서드로 선택자와 일치하는 요소 목록을 추출할
수 있습니다.
[<Element li at 0x1061825e8>, <Element li at 0x1081c14a8>, <Element li at 0x108869728>]

>>> h1 = html.xpath('//h1')[0]
>>> h1.tag # tag 속성으로 태그의 이름을 추출할 수 있습니다.
'h1'

>>> h1.text # text 속성으로 요소의 텍스트를 추출할 수 있습니다.
'오늘의 과일'

>>> h1.get('id') # get() 메서드로 속성 값을 추출할 수 있습니다.
'main'

>>> h1.attrib # attrib 속성으로 모든 속성을 나타내는 딕셔너리 같은 객체를 추출할 수 있습니다.
{'id': 'main'}

>>> h1.getparent() # getparent() 메서드로 부모 요소를 추출할 수 있습니다.
<Element body at 0x1061825e8>