Python XPath 데이터 스크래핑 실전 예제

XPath는 XML 및 HTML 문서에서 데이터를 효율적으로 추출하기 위한 강력한 도구입니다. lxml 라이브러리와 함께 사용하면 웹 스크래핑 작업을 간소화할 수 있습니다. 아래에서 기본 문법과 다양한 활용법을 예제를 통해 알아봅니다.

XPath 기본 문법

샘플 HTML 문서를 준비합니다:

from lxml import etree

html = """
<html>
<head lang="en">
<title>테스트</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="content">
<ul id="ul">
<li>NO.1</li>
<li>NO.2</li>
<li>NO.3</li>
</ul>
<ul id="ul2">
<li>one</li>
<li>two</li>
</ul>
</div>
<div id="url">
<a href="http:www.58.com" title="58">58</a>
<a href="http:www.csdn.net" title="CSDN">CSDN</a>
</div>
</body>
</html>
"""
  • //: 이중 슬래시는 루트 노드부터 전체 문서를 스캔하여 조건에 맞는 모든 요소를 리스트로 반환합니다.
  • /: 단일 슬래시는 현재 경로의 바로 아래 하위 태그를 선택하거나 현재 태그의 내용을 조작할 때 사용합니다.
  • /text(): 현재 경로에 있는 텍스트 내용을 추출합니다.
  • /@xxxx: 현재 경로에 있는 태그의 특정 속성 값을 가져옵니다.
  • |: OR 연산자로 여러 경로를 동시에 선택합니다. 예: //p | //div는 모든 p와 div 태그를 선택합니다.
  • .: 현재 노드를 가리킵니다.
  • ..: 현재 노드의 부모 노드를 가리킵니다.
  • starts-with(@속성명, "문자열"): 특정 속성 값이 지정된 문자열로 시작하는 요소를 선택합니다.
  • string(.): 현재 노드의 모든 텍스트를 하나의 문자열로 반환합니다.

예제 1: ID 속성으로 특정 요소 선택하기

selector = etree.HTML(html)
items = selector.xpath('//div[@id="content"]/ul[@id="ul"]/li/text()')
# id="content"인 div 안의 id="ul"인 ul 하위 li 태그들의 텍스트 추출
for item in items:
    print(item)
# 출력: NO.1, NO.2, NO.3

예제 2: 링크 속성 값 추출하기

links = selector.xpath('//a/@href')
# 전체 문서에서 모든 a 태그의 href 속성 수집
for link in links:
    print(link)
# 출력: http:www.58.com, http:www.csdn.net

예제 3: 절대 경로와 상대 경로 사용하기

# 절대 경로 사용
titles_abs = selector.xpath('/html/body/div/a/@title')
# 상대 경로 사용 (동일한 결과)
titles_rel = selector.xpath('//a/@title')
print(len(titles_abs))
print(titles_abs[0], titles_abs[1])
# 출력: 2, 58 CSDN

XPath 고급 기법

1. text()를 이용한 태그 식별

속성이 없는 태그를 구분할 때 유용합니다.

html2 = """
<div>hello
    <p>H</p>
</div>
<div>hehe</div>
"""
sel = etree.HTML(html2)
result = sel.xpath('//div[text()="hello"]/p/text()')
print(result[0])  # H

2. position()으로 순서 지정

같은 레벨의 태그 중 특정 위치의 요소를 선택합니다.

html3 = """
<div>hello
    <p>H</p>
    <p>J</p>
    <p>I</p>
</div>
<div>hehe</div>
"""
sel = etree.HTML(html3)
result = sel.xpath('//div[text()="hello"]/p[position()=2]/text()')
print(result[0])  # J

3. starts-with()로 공통 접두사 처리

속성 값이 특정 문자열로 시작하는 요소를 모두 선택합니다.

html4 = """
<body>
    <div id="aa">aa</div>
    <div id="ab">ab</div>
    <div id="ac">ac</div>
</body>
"""
selector = etree.HTML(html4)
items = selector.xpath('//div[starts-with(@id, "a")]/text()')
for item in items:
    print(item)
# 출력: aa, ab, ac

이러한 기법들을 조합하면 복잡한 HTML 구조에서도 원하는 데이터를 정확하게 추출할 수 있습니다.

태그: python lxml XPath 데이터스크래핑 웹크롤링

5월 26일 19:06에 게시됨