파 이 썬 파충류 (3): BeautifulSoup 라 이브 러 리
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 는 여러 가지 방법 과 속성 이 있 습 니 다. 여기 서 두 가지 상용 속성 을 살 펴 보 겠 습 니 다.
name
과 attributes
.우 리 는
.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 가 아니 기 때문에
name
와 attribute
속성 이 없습니다. 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.