python 파충류 입문 강좌-HTML 텍스트 해석 라 이브 러 리 BeautifulSoup(4)
11079 단어 pythonHTML 텍스트BeautifulSoup
python 파충류 시리즈 글 의 세 번 째 편 은 네트워크 요청 라 이브 러 리 Requests 를 소개 했다.데 이 터 를 되 돌려 달라 고 요청 한 후에 목표 데 이 터 를 추출 해 야 한다.서로 다른 사이트 에서 돌아 오 는 내용 은 보통 다양한 형식 이 있 는데 하 나 는 json 형식 으로 개발 자 에 게 가장 좋 은 데이터 이다.또 다른 XML 형식,그리고 가장 흔히 볼 수 있 는 형식 은 HTML 문서 입 니 다.오늘 은 HTML 에서 관심 있 는 데 이 터 를 추출 하 는 방법 에 대해 이야기 하 겠 습 니 다.
HTML 해석 기 를 직접 써 서 해석 하 시 겠 습 니까?아니면 정규 표현 식 으로?이것 은 모두 가장 좋 은 방법 이 아니다.다행히 Python 커 뮤 니 티 는 이 편리 함 에서 이미 성숙 한 방안 을 가지 게 되 었 다.Beautiful Soup 은 바로 이런 문제 의 적수 이다.이것 은 HTML 문서 조작 에 전념 하고 이름 은 Lewis Carroll 의 동명 시 에서 기원 되 었 다.
BeautifulSoup 은 HTML 문 서 를 해석 하 는 Python 라 이브 러 리 입 니 다.BeautifulSoup 을 통 해 아주 적은 코드 로 HTML 에서 관심 있 는 내용 을 추출 할 수 있 습 니 다.또한 HTML 용 착 력 도 있 습 니 다.형식 이 완전 하지 않 은 HTML 문서 에 대해 서도 정확하게 처리 할 수 있 습 니 다.
BeautifulSoup 설치
pip install beautifulsoup4
Beautiful Soup 3 는 공식 적 으로 유지 보 수 를 포기 하고 최신 버 전 Beautiful Soup 4 를 다운로드 해 야 합 니 다.HTML 태그
BeautifulSoup 4 를 배우 기 전에 HTML 문서 에 대해 기본 적 인 인식 을 가 질 필요 가 있 습 니 다.다음 코드,HTML 은 트 리 조직 구조 입 니 다.
<html>
<head>
<title>hello, world</title>
</head>
<body>
<h1>BeautifulSoup</h1>
<p> BeautifulSoup</p>
<body>
</html>
BeautifulSoup 대상 을 구축 하려 면 두 개의 인자 가 필요 합 니 다.첫 번 째 매개 변 수 는 분석 할 HTML 텍스트 문자열 입 니 다.두 번 째 매개 변 수 는 BeautifulSoup 에 게 HTML 을 해석 할 해석 기 를 사용 하 는 지 알려 줍 니 다.
"해상도 기 는 HTML 을 관련 대상 으로 해석 하고 BeautifulSoup 은 데 이 터 를 조작 합 니 다(추가 삭제 및 검사)."html.parser"는 Python 에 내 장 된 해상도 입 니 다."lxml"은 c 언어 를 기반 으로 개발 한 해상도 입 니 다.실행 속도 가 빠 르 지만 추가 설치 가 필요 합 니 다.
BeautifulSoup 대상 을 통 해 HTML 의 모든 태그 노드 를 찾 을 수 있 습 니 다.
from bs4 import BeautifulSoup
text = """
<html>
<head>
<title >hello, world</title>
</head>
<body>
<h1>BeautifulSoup</h1>
<p class="bold"> BeautifulSoup</p>
<p class="big" id="key1"> p </p>
<a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>
</body>
</html>
"""
soup = BeautifulSoup(text, "html.parser")
# title
>>> soup.title
<title>hello, world</title>
# p
>>> soup.p
<p class="bold">\u5982\u4f55\u4f7f\u7528BeautifulSoup</p>
# p
>>> soup.p.string
u'\u5982\u4f55\u4f7f\u7528BeautifulSoup'
BeatifulSoup 은 HTML 을 Tag,NavigableString,BeautifulSoup,Comment 등 4 가지 주요 데이터 형식 으로 추상 화 했다.모든 탭 노드 는 태그 대상 입 니 다.NavigableString 대상 은 일반적으로 태그 대상 에 포 함 된 문자열 입 니 다.BeautifulSoup 대상 은 전체 HTML 문 서 를 대표 합 니 다.예 를 들 면:
>>> type(soup)
<class 'bs4.BeautifulSoup'>
>>> type(soup.h1)
<class 'bs4.element.Tag'>
>>> type(soup.p.string)
<class 'bs4.element.NavigableString'>
Tag태그 마다 HTML 의 태그 이름 에 대응 하 는 이름 이 있 습 니 다.
>>> soup.h1.name
u'h1'
>>> soup.p.name
u'p'
탭 은 속성 도 있 습 니 다.속성 접근 방식 은 사전 과 유사 합 니 다.목록 대상 을 되 돌려 줍 니 다.
>>> soup.p['class']
[u'bold']
NavigableString탭 의 내용 을 가 져 옵 니 다.'stirng'을 사용 하면 가 져 올 수 있 습 니 다.NavigableString 대상 입 니 다.유 니 코드 문자열 로 명시 적 으로 변환 할 수 있 습 니 다.
>>> soup.p.string
u'\u5982\u4f55\u4f7f\u7528BeautifulSoup'
>>> type(soup.p.string)
<class 'bs4.element.NavigableString'>
>>> unicode_str = unicode(soup.p.string)
>>> unicode_str
u'\u5982\u4f55\u4f7f\u7528BeautifulSoup'
기본 개념 소개 가 끝나 면 이제 본 격 적 으로 주제 에 들 어 갈 수 있 습 니 다.어떻게 HTML 에서 우리 가 관심 을 가 지 는 데 이 터 를 찾 을 수 있 습 니까?BeautifulSoup 은 두 가지 방식 을 제공 합 니 다.하 나 는 옮 겨 다 니 는 것 이 고 다른 하 나 는 검색 입 니 다.보통 두 가 지 를 결합 하여 검색 임 무 를 완성 합 니 다.문서 트 리 옮 겨 다 니 기
문서 트 리 를 옮 겨 다 니 는 것 은 말 그대로 뿌리 노드 html 태그 부터 옮 겨 다 니 는 것 입 니 다.대상 요 소 를 찾 을 때 까지 옮 겨 다 니 는 결함 중 하 나 는 문서 의 끝 에 있 는 내용 을 찾 으 려 면 전체 문 서 를 옮 겨 다 녀 야 찾 을 수 있 고 속도 가 느 립 니 다.그래서 두 번 째 방법 에 맞 춰 야 한다.
문서 트 리 를 옮 겨 다 니 는 방식 으로 탭 노드 를 가 져 올 수 있 습 니 다.탭 이름 으로 가 져 올 수 있 습 니 다.예 를 들 어:
바디 태그 가 져 오기:
>>> soup.body
<body>
<h1>BeautifulSoup</h1>
<p class="bold">\u5982\u4f55\u4f7f\u7528BeautifulSoup</p>
</body>
p 태그 가 져 오기
>>> soup.body.p
<p class="bold">\u5982\u4f55\u4f7f\u7528BeautifulSoup</p>
p 탭 의 내용 가 져 오기
>>> soup.body.p.string
\u5982\u4f55\u4f7f\u7528BeautifulSoup
앞에서 말 했 듯 이 내용 도 하나의 노드 이 고 여 기 는'string'방식 으로 얻 을 수 있 습 니 다.문서 트 리 를 옮 겨 다 니 는 또 다른 단점 은 일치 하 는 첫 번 째 키 노드 만 얻 을 수 있다 는 것 입 니 다.예 를 들 어 인접 한 p 태그 가 두 개 있 으 면 두 번 째 태 그 는.p 방식 으로 얻 을 수 없습니다.이것 은 next 를 빌려 야 합 니 다.sibling 속성 은 인접 하고 뒤에 있 는 노드 를 가 져 옵 니 다.그 밖 에 자주 사용 되 지 않 는 속성 도 많 습 니 다.예 를 들 어'contents'는 모든 하위 노드 를 가 져 오고'parent'는 부모 노드 를 가 져 옵 니 다.더 많은 참고 사항 은 보 세 요공식 문서.문서 트 리 검색
문서 트 리 를 검색 하 는 것 은 지정 한 태그 이름 을 통 해 요 소 를 검색 하 는 것 입 니 다.또한 지정 한 태그 의 속성 값 을 통 해 특정한 노드 요 소 를 정확하게 찾 을 수 있 습 니 다.가장 자주 사용 하 는 두 가지 방법 은 find 와 find 입 니 다.all。이 두 가지 방법 은 BeatifulSoup 과 Tag 대상 에서 모두 호출 될 수 있다.
find_all()
find_all( name , attrs , recursive , text , **kwargs )
find_all 의 반환 값 은 태그 로 구 성 된 목록 으로 방법 호출 이 매우 유연 하고 모든 매개 변 수 를 선택 할 수 있 습 니 다.첫 번 째 매개 변수 name 은 탭 노드 의 이름 입 니 다.
# title
>>> soup.find_all("title")
[<title>hello, world</title>]
>>> soup.find_all("p")
[<p class="bold">\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup</p>,
<p class="big"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
두 번 째 매개 변 수 는 탭 의 class 속성 값 입 니 다.
# class big p
>>> soup.find_all("p", "big")
[<p class="big"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
...과 같다
>>> soup.find_all("p", class_="big")
[<p class="big"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
class 는 Python 키워드 이기 때문에 class 로 지정 합 니 다.kwargs 는 탭 의 속성 이름 값 입 니 다.예 를 들 어 href 속성 값 을 찾 습 니 다."http://foofish.net"라 는 해시 태그
>>> soup.find_all(href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" )
[<a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>]
물론 정규 표현 식 도 지원 합 니 다.
>>> import re
>>> soup.find_all(href=re.compile("^http"))
[<a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>]
속성 은 구체 적 인 값,정규 표현 식 을 제외 하고 불 값(True/Flase)으로 속성 이 있 거나 없 음 을 표시 할 수 있 습 니 다.
>>> soup.find_all(id="key1")
[<p class="big" id="key1"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
>>> soup.find_all(id=True)
[<p class="big" id="key1"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
스 트 리밍 과 검색 을 결합 하여 찾 습 니 다.먼저 body 태그 로 위치 하고 검색 범 위 를 좁 힌 다음 body 에서 a 태 그 를 찾 습 니 다.
>>> body_tag = soup.body
>>> body_tag.find_all("a")
[<a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>]
find()find 방법 과 findall 과 유사 합 니 다.유일 하 게 다른 점 은 목록 이 아 닌 단일 태그 대상 을 되 돌려 주 는 것 입 니 다.일치 하 는 노드 를 찾 지 못 하면 None 로 돌아 갑 니 다.여러 태그 가 일치 하면 0 번 째 만 되 돌려 줍 니 다.
>>> body_tag.find("a")
<a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>
>>> body_tag.find("p")
<p class="bold">\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup</p>
get_text()탭 에 있 는 내용 가 져 오기.string 외 에 get 도 사용 할 수 있 습 니 다.text 방법,다른 점 은 전자 가 돌아 온 NavigableString 대상 이 고 후 자 는 유 니 코드 형식의 문자열 을 되 돌려 줍 니 다.
>>> p1 = body_tag.find('p').get_text()
>>> type(p1)
<type 'unicode'>
>>> p1
u'\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup'
>>> p2 = body_tag.find("p").string
>>> type(p2)
<class 'bs4.element.NavigableString'>
>>> p2
u'\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup'
>>>
실제 장면 에서 우 리 는 보통 get 을 사용한다.text 방법 으로 탭 의 내용 을 가 져 옵 니 다.총결산
BeatifulSoup 은 HTML 문 서 를 조작 하 는 Python 라 이브 러 리 로 BeatifulSoup 을 초기 화 할 때 HTML 문서 문자열 과 구체 적 인 해석 기 를 지정 해 야 합 니 다.BeatifulSoup 은 Tag,NavigableString,BeautifulSoup 등 세 가지 자주 사용 하 는 데이터 형식 이 있 습 니 다.HTML 요 소 를 찾 는 데 는 두 가지 방법 이 있 습 니 다.각각 문서 트 리 와 문서 트 리 를 옮 겨 다 니 는 것 입 니 다.보통 데 이 터 를 빨리 얻 으 려 면 두 가지 결합 이 필요 합 니 다.
자,이상 은 이 글 에 관 한 모든 내용 입 니 다.본 논문 의 내용 이 여러분 에 게 공부 하거나 python 을 사용 하 는 데 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.