파 이 썬 파충류 (3): BeautifulSoup 라 이브 러 리

13057 단어
BeautifulSoup 은 HTML 이나 XML 파일 에서 데 이 터 를 추출 할 수 있 는 Python 라 이브 러 리 로, HTML 이나 XML 을 위치 추적 가능 한 트 리 구조 로 변환 하고, 입력 문 서 를 자동 으로 유 니 코드 인 코딩 으로 변환 하고, 출력 문 서 를 UTF - 8 인 코딩 으로 변환 하 는 내 비게 이 션, 찾기, 수정 기능 을 제공 합 니 다.
BeautifulSoup 은 Python 표준 라 이브 러 리 의 HTML 해석 기와 일부 제3자 해석 기 를 지원 합 니 다. 기본적으로 Python 표준 라 이브 러 리 의 HTML 해석 기 를 사용 합 니 다. 기본 해석 기 는 효율 이 상대 적 으로 낮 습 니 다. 분석 할 데이터 의 양 이 많 거나 빈번 하 다 면 더욱 강하 고 빠 른 lxml 해석 기 를 사용 하 는 것 을 추천 합 니 다.
설치
1) BeautifulSoup 설 치 는 Debain 이나 ubuntu 시스템 을 사용 하면 시스템 패키지 관 리 를 통 해 설치 할 수 있 습 니 다. apt-get install Python-bs4 시스템 패키지 관리 로 설치 할 수 없 으 면 pip install beautifulsoup4 로 설치 할 수 있 습 니 다.
2) 제3자 해석 기 를 설치 하려 면 제3자 해석 기 lxml 또는 html5lib 를 사용 해 야 하지만 다음 명령 으로 설치 합 니 다. apt-get install Python-lxml(html5lib)pip install lxml(html5lib).
주요 해석 기와 그들의 장단 점 을 살 펴 보 자.
해석 기
사용 방법
우세 하 다.
열세
파 이 썬 표준 라 이브 러 리BeautifulSoup(markup, "html.parser")
Python 내 장 된 표준 라 이브 러 리;실행 속도 가 적당 하 다.문서 의 용 착 력 이 강하 다.
Python 2.7.3 or 3.2.2) 이전 버 전에 서 문서 의 잘못 사용 능력 이 떨 어 졌 습 니 다.
lxml HTML 해상도BeautifulSoup(markup, "lxml")
속도 가 빠르다문서 의 용 착 력 이 강하 다.
C 언어 라 이브 러 리 를 설치 해 야 합 니 다.
lxml XML 해상도 기BeautifulSoup(markup, ["lxml-xml"]) BeautifulSoup(markup, "xml")
속도 가 빠르다XML 을 지원 하 는 유일한 해상도 입 니 다.
C 언어 라 이브 러 리 설치 필요
html5lib BeautifulSoup(markup, "html5lib")
가장 좋 은 용 착 성;브 라 우 저 방식 으로 문서 분석 하기;HTML 5 형식의 문 서 를 만 듭 니 다.
속도 가 느리다외부 확장 에 의존 하지 않 습 니 다.
2 빠르게 시작
문 서 를 BeautifulSoup 의 구조 방법 에 전달 하면 문서 의 대상 을 얻 을 수 있 습 니 다. 문자열 이나 파일 핸들 을 입력 할 수 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
1) 다음 과 같은 HTML 문자열 을 사용 합 니 다.
html = '''



    
    BeautifulSoup  


Hello BeautifulSoup


'''

사용 예 는 다음 과 같다.
from bs4 import BeautifulSoup
#       
soup = BeautifulSoup(html,'html.parser')
#   lxml    
soup = BeautifulSoup(html,'lxml')

2) 로 컬 파일 은 위의 HTML 을 예 로 들 어 위의 HTML 문자열 을 index. html 파일 에 두 고 다음 과 같은 예 시 를 사용 합 니 다.
#       
soup = BeautifulSoup(open('index.html'),'html.parser')
#   lxml    
soup = BeautifulSoup(open('index.html'),'lxml')

2.1 대상 의 종류
BeautifulSoup 은 HTML 문 서 를 하나의 트 리 구조 로 변환 합 니 다. 각 노드 는 Python 대상 이 고 모든 대상 은 4 가지 로 요약 할 수 있 습 니 다. Tag, NavigableString, BeautifulSoup, Comment.
1) 태그 대상 태그 대상 은 HTML 또는 XML 원본 문서 의 tag 와 같 습 니 다. 예 는 다음 과 같 습 니 다.
soup = BeautifulSoup('BeautifulSoup  ','lxml')
tag = soup.title
tp =type(tag)
print(tag)
print(tp)

#    
'''
BeautifulSoup  

'''

Tag 는 여러 가지 방법 과 속성 이 있 습 니 다. 여기 서 두 가지 상용 속성 을 살 펴 보 겠 습 니 다. nameattributes.
우 리 는 .name 을 통 해 tag 의 이름 을 얻 을 수 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
soup = BeautifulSoup('BeautifulSoup  ','lxml')
tag = soup.title
print(tag.name)

#    
#title

tag 의 name 도 수정 할 수 있 습 니 다. 예 는 다음 과 같 습 니 다.
tag.name = 'title1'
print(tag)

#    
#BeautifulSoup  

하나의 tag 는 여러 개의 속성 이 있 을 수 있 습 니 다. 먼저 그것 의 class 속성 을 보 세 요. 그 속성의 조작 방법 은 사전 과 같 습 니 다. 예 는 다음 과 같 습 니 다.
soup = BeautifulSoup('BeautifulSoup  ','lxml')
tag = soup.title
cls = tag['class']
print(cls)

#    
#['tl']

우 리 는 또한 .attrs 를 사용 하여 얻 을 수 있다. 예 는 다음 과 같다.
ats = tag.attrs
print(ats)

#    
#{'class': ['tl']}

tag 의 속성 은 추가, 수정, 삭제 할 수 있 습 니 다. 예 는 다음 과 같 습 니 다.
#   id   
tag['id'] = 1

#   class   
tag['class'] = 'tl1'

#   class   
del tag['class']

2) NavigableString 대상 NavigableString 류 는 tag 의 문자열 내용 을 포장 하 는 데 사 용 됩 니 다. .string 를 사용 하여 문자열 내용 을 가 져 옵 니 다. 예 를 들 어 다음 과 같 습 니 다.
str = tag.string
replace_with() 방법 으로 기 존 문자열 의 내용 을 다른 내용 으로 바 꿀 수 있 습 니 다. 예 는 다음 과 같 습 니 다.
tag.string.replace_with('BeautifulSoup')

3) BeautifulSoup 대상 BeautifulSoup 대상 은 하나의 문서 의 모든 내용 을 표시 합 니 다. 이것 은 진정한 HTML 이나 XML 의 tag 가 아니 기 때문에 nameattribute 속성 이 없습니다. name 속성 을 쉽게 보기 위해 BeautifulSoup 대상 은 [document] 의 특수 속성 .name 을 포함 합 니 다. 예 를 들 어 다음 과 같 습 니 다.
soup = BeautifulSoup('BeautifulSoup  ','lxml')
print(soup.name)

#    
#[document]

4) Comment 대상 Comment 대상 은 특수 한 형식의 NavigableString 대상 입 니 다. 특수 한 형식 으로 출력 합 니 다. 예 를 들 어 보 세 요.
soup = BeautifulSoup('Hello BeautifulSoup','html.parser')
comment = soup.title.prettify()
print(comment)

#    
'''

 Hello BeautifulSoup

'''

앞에서 본 예 에서 tag 의 문자열 내용 은 주석 내용 이 아 닙 니 다. 현재 문자열 내용 을 주석 내용 으로 바 꿉 니 다. 효 과 를 살 펴 보 겠 습 니 다.
soup = BeautifulSoup('<!--Hello BeautifulSoup-->','html.parser')
str = soup.title.string
print(str)

#    
#Hello BeautifulSoup

결 과 를 통 해 우 리 는 주석 기호 가 자동 으로 제 거 된 것 을 발견 하 였 으 니, 이 점 을 주의해 야 한다.
2.2 문서 트 리 검색
BeautifulSoup 은 많은 검색 방법 을 정 의 했 습 니 다. 구체 적 으로 살 펴 보 겠 습 니 다.
1)find_all() find_all () 방법 은 현재 tag 의 모든 tag 서브 노드 를 검색 합 니 다. 방법 은 다음 과 같 습 니 다. find_all(name=None, attrs={}, recursive=True, text=None,limit=None, **kwargs) 각 매개 변 수 를 구체 적 으로 보 겠 습 니 다.name 매개 변 수 는 모든 이름 name 의 tag 를 찾 을 수 있 습 니 다. 문자열 대상 은 자동 으로 무 시 됩 니 다. 예 를 들 어 다음 과 같 습 니 다.
soup = BeautifulSoup('Hello BeautifulSoup','html.parser')
print(soup.find_all('title'))

#    
#[Hello BeautifulSoup]
attrs 매개 변 수 는 사전 매개 변 수 를 정의 하여 특수 속성 을 포함 하 는 tag 를 검색 합 니 다. 예 를 들 어 다음 과 같 습 니 다.
soup = BeautifulSoup('Hello BeautifulSoup','html.parser')
soup.find_all(attrs={"class": "tl"})

find 호출all () 방법 은 기본적으로 현재 tag 의 모든 자손 노드 를 검색 합 니 다. 매개 변수 recursive=False 를 설정 하면 tag 의 직접 하위 노드 만 검색 할 수 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
soup = BeautifulSoup('Hello BeautifulSoup','html.parser')
print(soup.find_all('title',recursive=False))

#    
#[]
text 인 자 를 통 해 문서 의 문자열 내용 을 검색 할 수 있 습 니 다. 문자열, 정규 표현 식, 목록, True 를 받 아들 일 수 있 습 니 다. 예 는 다음 과 같 습 니 다.
from bs4 import BeautifulSoup
import re

soup = BeautifulSoup('myHeadBeautifulSoup','html.parser')
#   
soup.find_all(text='BeautifulSoup')

#     
soup.find_all(soup.find_all(text=re.compile('title')))

#  
soup.find_all(soup.find_all(text=['head','title']))

#True
soup.find_all(text=True)
limit 매개 변 수 는 SQL 의 limit 키워드 와 유사 하 며 검색 을 제한 하 는 데 사용 되 는 데 이 터 를 예 로 들 면 다음 과 같다.
soup = BeautifulSoup('ElsieElsie','html.parser')
soup.find_all('a', limit=1)

우 리 는 Python 에서 *arg**kwargs 두 가지 가 변 매개 변 수 를 자주 볼 수 있 습 니 다. *arg 키 값 이 아 닌 가 변 수량 을 나타 내 는 매개 변 수 를 tuple 로 포장 하여 함수 에 전달 합 니 다.**kwargs 키워드 파 라 메 터 를 표시 하고 파 라 메 터 는 키 쌍 형식 이 며 파 라 메 터 를 dict 로 포장 하여 함수 에 전달 합 니 다.
여러 개의 지정 한 이름 의 인 자 를 사용 하면 tag 의 여러 속성 을 동시에 걸 러 낼 수 있 습 니 다. 예 를 들 어:
soup = BeautifulSoup('ElsieElsie','html.parser')
soup.find_all(href=re.compile("elsie"),id='link1')

일부 tag 속성 은 검색 에서 사용 할 수 없습니다. 예 를 들 어 HTML 5 의 data-* 속성 은 다음 과 같 습 니 다.
soup = BeautifulSoup('
foo!
') soup.find_all(data-foo='value')

먼저 Pycharm 에 입력 data-foo='value' 하면 문법 이 틀 렸 다 는 것 을 알 립 니 다. 그리고 저 는 힌트 를 상관 하지 않 고 힌트 를 직접 실행 합 니 다 SyntaxError: keyword can't be an expression. 이 결과 도 검증 되 었 습 니 다 data-* 속성 은 검색 에서 사용 할 수 없습니다.우 리 는 find 를 통 해all () 방법의 attrs 매개 변 수 는 사전 매개 변 수 를 정의 하여 특수 속성 을 포함 하 는 tag 를 검색 합 니 다. 예 를 들 어 다음 과 같 습 니 다.
print(soup.find_all(attrs={'data-foo': 'value'}))

2) find () 방법 은 다음 과 같다. find(name=None, attrs={}, recursive=True, text=None,**kwargs) 우 리 는 limit 매개 변수 가 적 다 는 것 을 제외 하고 다른 매개 변 수 는 방법 find_all 과 마찬가지 로 다른 점 은 findall () 방법의 반환 결 과 는 목록 입 니 다. find () 방법 은 첫 번 째 노드, find 를 되 돌려 줍 니 다.all () 방법 이 목 표를 찾 지 못 한 것 은 빈 목록 으로 돌아 가 는 것 입 니 다. find () 방법 이 목 표를 찾 지 못 했 을 때 None 로 돌아 갑 니 다.예 를 들 어:
soup = BeautifulSoup('ElsieElsie','html.parser')
print(soup.find_all('a', limit=1))
print(soup.find('a'))

#    
'''
[Elsie]
Elsie
'''

예 를 들 어 find () 방법 은 찾 은 첫 번 째 노드 를 되 돌려 주 는 것 임 을 알 수 있다.
3)find_parents () 와 findparent() find_all () 과 find () 는 현재 노드 의 모든 하위 노드 를 검색 합 니 다. findparents () 와 findparent () 는 현재 노드 의 아버지 세대 노드 를 검색 하 는 데 사 용 됩 니 다.
4)find_next_siblings () 와 findnext_sibling () 이 두 가지 방법 은. next 를 통 해siblings 속성 은 현재 tag 의 모든 뒤에 분 석 된 형제 tag 노드 를 교체 합 니 다. findnext_siblings () 방법 은 모든 조건 에 부합 되 는 뒤의 형제 노드 를 되 돌려 줍 니 다. findnext_sibling () 은 조건 에 맞 는 첫 번 째 tag 노드 만 되 돌려 줍 니 다.
5)find_previous_siblings () 와 findprevious_sibling () 이 두 가지 방법 은. previous 를 통 해siblings 속성 은 현재 tag 앞에서 분 석 된 형제 tag 노드 를 교체 합 니 다. findprevious_siblings () 방법 은 모든 조건 에 부합 되 는 앞의 형제 노드 를 되 돌려 줍 니 다. findprevious_sibling () 방법 은 첫 번 째 조건 에 부합 되 는 앞의 형제 노드 를 되 돌려 줍 니 다.
6)find_all_next () 와 findnext () 이 두 가지 방법 은. next 를 통 해elements 속성 은 현재 tag 이후 의 tag 와 문자열 을 교체 합 니 다. findall_next () 방법 은 조건 에 맞 는 모든 노드 를 되 돌려 줍 니 다. findnext () 방법 은 첫 번 째 조건 에 맞 는 노드 를 되 돌려 줍 니 다.
7)find_all_previous () 와 findprevious () 이 두 가지 방법 은. previous 를 통 해elements 속성 은 현재 노드 앞의 tag 와 문자열 을 교체 합 니 다. findall_previous () 방법 은 조건 에 맞 는 모든 노드 를 되 돌려 줍 니 다. findprevious () 방법 은 첫 번 째 조건 에 맞 는 노드 를 되 돌려 줍 니 다.
2.3 CSS 선택 기
BeautifulSoup 은 대부분의 CSS 선택 기 를 지원 합 니 다. Tag 나 BeautifulSoup 대상 의. select () 방법 에 문자열 인 자 를 입력 하면 CSS 선택 기의 문법 으로 tag 를 찾 아 목록 으로 형식 을 되 돌려 줍 니 다.예 는 다음 과 같다.
soup = BeautifulSoup('ElsieElsie','html.parser')
print(soup.select('a'))

#    
#[Elsie, Elsie]

탭 을 통 해 층 층 이 찾기
soup.select('body a')

태그 탭 의 직접 하위 탭 을 찾 습 니 다.
soup.select('body > a')

클래스 이름 으로 찾기
soup.select('.elsie')
soup.select('[class~=elsie]')

id 로 찾기
soup.select('#link1')

여러 개의 선택 기 사용
soup.select('#link1,#link2')

속성 으로 찾기
soup.select('a[class]')

속성 값 으로 찾기
soup.select('a[class="elsie"]')

원소 의 첫 번 째 찾기
soup.select_one('.elsie')

형제 노드 탭 찾기
#    
soup.select('#link1 ~ .elsie')
#     
soup.select('#link1 + .elsie')

참고:https://beautifulsoup.readthedocs.io/zh_CN/latest/#next-siblings-previous-siblings

좋은 웹페이지 즐겨찾기