import requests from bs4 import BeautifulSoup # BeautifulSoup 모듈 import url = https://ko.wikipedia.org/wiki/%EC%9B%B9_%ED%81%AC%EB%A1%A4%EB%9F%AC # 위키피디아 “웹 크롤러 검색” URL response = requests.get(url) response.raise_for_status() # requests 객체를 통해 얻어온 response.txt를 파서를 통해서 bs 객체로 변환 (내장파서 html.parser와 외장파서 lxml 등이 있다.) soup = BeautifulSoup(response.text, 'html.parser') # 이후, soup 객체가 제공하는 함수나 속성 등을 이용해 데이터 추출
종류 | 사용방법 | 특징 |
html.parser | BeautifulSoup(markup, "html.parser") BeautifulSoup('<a></p>', 'html.parser’) -> <a></a> 형태로 강제 변경되어 처리됨 |
•파이썬이 제공하는 기본 파서
•괜찮은 속도
|
lxml | BeautifulSoup(markup, "lxml") BeautifulSoup('<a></p>', 'lxml’) -> <html><body><a></a></body></html> 형태로 강제 변경되어 처리됨 |
•기본값
•아주 빠름
•외부 C 라이브러리 의존
|
xml | BeautifulSoup(markup, "xml") BeautifulSoup('<a><b/>', 'xml') -> <?xml version="1.0" encoding="utf-8" ?> <a/> 형태로 강제 변경되어 처리됨 |
•아주 빠름
•XML 해석기 지원
|
html5lib | BeautifulSoup(markup, “html5lib") BeautifulSoup('<a><b />', ‘html5lib') -> <html><head></head><body><a><b></b></a></body></html> |
•웹 브라우저와 동일한 방식으로 페이지를 분석하고 유효한 HTML5를 생성
•매우 느림
|
1) BeautifulSoup 모듈 import
from bs4 import BeautifulSoup # BeautifulSoup 모듈 import
2) 태그를 이용한 접근
soup.title # soup 객체에서 첫 번째로 만나는 title 태그 출력 soup.footer.ul.li # soup 객체에서 첫 번째로 만나는 footer 태그의 하위 태그 ul, 그리고 그 하위 태그인 li 태그 출력
3) 태그와 속성을 이용한 접근
soup.a # soup 객체에서 첫 번째로 만나는 a element 출력 soup.a['id'] # a 태그의 속성들 중 “id" 속성값 정보 출력. 만약 속성이 존재하지 않을 경우 에러
4) find()를 이용한 태그 내의 다양한 속성을 이용한 접근
soup.find("a", attrs={"title" : "구글봇"}) # a element의 속성 중 title 속성의 값이 “구글 봇”인 데이터 검색 soup.find(attrs={"title" : "구글봇"}) # title 속성이 “구글봇”인 어떤 element를 찾아 출력
import requests from bs4 import BeautifulSoup req = requests.get("https://www.naver.com") html = req.text soup = BeautifulSoup(html, "html.parser") print(soup.title) print(soup.title.name) print(soup.title.string)
<title>NAVER</title> title NAVER |
# string이 있는 title 태그의 문자열 모두 검색 soup.title.find_all(string=True) soup.title(string=True) print(soup.img) print(soup.img['src']) print(soup.img['width'])
<img alt="" height="49" src="https://static-whale.pstatic.net/main/img_darkmode_v9@2x.png" style="padding-left: 90px" width="220"/> https://static-whale.pstatic.net/main/img_darkmode_v9@2x.png 220 |
print(soup.find('a')) print(soup.find(id='search'))
<a href="#newsstand"><span>뉴스스탠드 바로가기</span></a> <div class="search_area" data-clk-prefix="sch" id="search"> |
print(soup.find_all('a', limit=2))
[<a href="#newsstand"><span>뉴스스탠드 바로가기</span></a>, <a href="#themecast"><span>주제별캐스트 바로가기</span></a>] |
print(soup.find_all('span', class_='blind')) print(soup.find_all('span', attrs={"class":"blind"}))
[<span class="blind">NAVER whale</span>, <span class="blind">네이버</span>,... ] |
print(soup.find_all(string='자동완성 끄기'))
['자동완성 끄기'] |
#태그 찾기 soup.select("title") #특정 태그 아래에 있는 태그 찾기 soup.select("div a") #div 태그 아래에 있는 모든 a 태그 찾기 #특정 태그 바로 아래에 있는 태그 찾기 soup.select("head > title") soup.select("head > #link1") #아이디로 태그 찾음 #CSS class로 태그 찾기 soup.select(".sister") #ID값으로 태그 찾기 soup.select("#link1")
Selector | Example | Example Description |
.class | .intro | class="intro“ 를 갖는 모든 요소 선택 |
.class1.class2 | .name1.name2 | 클래스 속성 내에서 name1과 name2가 모두 설정된 모든 요소를 선택 |
.class1 .class2 | .name1 .name2 | name1을 가진 요소의 하위 요소 중 name2를 가진 모든 요소를 선택 |
#id | #firstname | id="firstname“ 를 갖는 요소 선택 |
element | p | 모든 <p> 요소 선택 |
element.class | p.intro | class="intro"를 갖는 모든 <p> 요소 선택 |
element,element | div, p | 모든 <div> 요소와 모든 <p> 요소 선택 |
element element | div p | <div> 요소 내의 모든 <p> 요소 선택 |
element>element | div > p | 상위 요소가 <div> 요소인 모든 <p> 요소 선택 |
[attribute=value] | [target="_blank"] | target="_blank“ 속성을 갖는 모든 요소 선택 |
:nth-child(n) | p:nth-child(2) | 부모 요소의 두 번째 자식 요소에 해당하는 모든 <p> 요소 선택 |
text = soup.find("span", attrs={"class":"blind"}) print(text) print(text.get_text())
<span class="blind">NAVER whale</span> NAVER whale |
text = soup.find("span", attrs={"class":"blind"}) print(text) print(text.get('class'))
<span class="blind">NAVER whale</span> ['blind'] |
text = soup.find("a", attrs={"data-clk":"squ.dust"}) print(text) print(text.string) result = text.find("strong", attrs={"class":"state state_normal"}) print(result.string)
<a class="air_area" data-clk="squ.dust" href="https://weather.naver.com/today/09680105"> <ul class="list_air"> <li class="air_item">미세<strong class="state state_normal">보통</strong></li> <li class="air_item">초미세<strong class="state state_bad">나쁨</strong></li> </ul> <span class="location">삼성동</span> </a> None 보통 |
result = soup.find("a", attrs={"data-clk":"squ.dust"}) print(result) print(result.text)
<a class="air_area" data-clk="squ.dust" href="https://weather.naver.com/today/09680105"> <ul class="list_air"> <li class="air_item">미세<strong class="state state_normal">보통</strong></li> <li class="air_item">초미세<strong class="state state_bad">나쁨</strong></li> </ul> <span class="location">삼성동</span> </a> 미세보통 초미세나쁨 삼성동 |
12. Selenium 모듈 (0) | 2023.11.01 |
---|---|
10. 정규 표현식 - 3 (0) | 2023.10.30 |
09. 정규 표현식 - 2 (0) | 2023.10.27 |
댓글 영역