# 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>
'[업무 지식] > Crawling' 카테고리의 다른 글
[Beautiful Soup] 이해하기 (0) | 2024.12.31 |
---|---|
[lxml] lxml로 스크레이핑 (0) | 2024.12.31 |
[Request] 웹 페이지 간단하게 추출하기 (0) | 2024.12.31 |
[스크레이핑 흐름] 파이썬으로 스크레이핑하는 흐름 (0) | 2024.12.31 |
[저장하기] 데이터베이스(SQLite3)에 저장하기 (0) | 2024.12.31 |