[Python] BeautifulSoup
BeautifulSoup 활용
웹 크롤링을 할 때 자주 사용하는 library인 beautifulsoup의 예시 코드는 다음과 같다.
import requests from bs4 import BeautifulSoup url = "https://en.wikipedia.org/wiki/Seoul_Metropolitan_Subway" resp = requests.get(url) html_src = resp.text soup = BeautifulSoup(html_src, 'html.parser') print(type(soup)) print("\n") print(soup.head) # head tab 부분 print("\n") print(soup.body) # body tab 부분 print("\n") print('title 태그 요소: ', soup.title) print('title 태그 이름: ', soup.title.name) print('title 태그 문자열: ', soup.title.string)
<class ‘bs4.BeautifulSoup’> <head> <meta charset=”utf-8″/> … title 태그 요소: Seoul Metropolitan Subway – Wikipedia title 태그 이름: title title 태그 문자열: Seoul Metropolitan Subway – Wikipedia |
웹 문서의 그림 이미지 파일 PC에 저장
웹상에 존재하는 이미지를 저장할 때 beautifulsoup library를 활용해서 수행 가능하다.
import requests from bs4 import BeautifulSoup url = "https://en.wikipedia.org/wiki/Seoul_Metropolitan_Subway" resp = requests.get(url) html_src = resp.text soup = BeautifulSoup(html_src, 'html.parser') target_img = soup.find(name='img', attrs={'alt':'Seoul-Metro-2004-20070722.jpg'}) print('HTML 요소: ', target_img) print("\n") target_img_src = target_img.get('src') print('이미지 파일 경로: ', target_img_src) print("\n") target_img_resp = requests.get('http:' + target_img_src) out_file_path = "download_image.jpg" with open(out_file_path, 'wb') as out_file: out_file.write(target_img_resp.content) print("이미지 파일로 저장하였습니다.")
HTML 요소: <img alt=”Seoul-Metro-2004-20070722.jpg” data-file-height=”2100″ data-file-width=”2800″ decoding=”async” height=”169″ src=”//upload.wikimedia.org/wikipedia/commons/thumb/2/29/Seoul-Metro-2004-20070722.jpg/225px-Seoul-Metro-2004-20070722.jpg” srcset=”//upload.wikimedia.org/wikipedia/commons/thumb/2/29/Seoul-Metro-2004-20070722.jpg/338px-Seoul-Metro-2004-20070722.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/29/Seoul-Metro-2004-20070722.jpg/450px-Seoul-Metro-2004-20070722.jpg 2x” width=”225″/> 이미지 파일 경로: //upload.wikimedia.org/wikipedia/commons/thumb/2/29/Seoul-Metro-2004-20070722.jpg/225px-Seoul-Metro-2004-20070722.jpg 이미지 파일로 저장하였습니다. |
웹 문서에 포함된 모든 하이퍼링크 추출
하이퍼링크는 tag 명이 a이기 때문에 a 이름의 tag를 모드 찾으면 된다.
import requests, re from bs4 import BeautifulSoup url = "https://en.wikipedia.org/wiki/Seoul_Metropolitan_Subway" resp = requests.get(url) html_src = resp.text soup = BeautifulSoup(html_src, 'html.parser') links = soup.find_all("a") print("하이퍼링크의 개수: ", len(links)) print("\n") print("첫 3개의 원소: ", links[:3]) print("\n") wiki_links = soup.find_all(name="a", href=re.compile("/wiki/"), limit=3) print("/wiki/ 문자열이 포함된 하이퍼링크: ", wiki_links) print("\n") external_links = soup.find_all(name="a", attrs={"class":"external text"}, limit=3) print("class 속성으로 추출한 하이퍼링크: ", external_links)
하이퍼링크의 개수: 968 첫 3개의 원소: [<a id=”top”></a>, <a class=”mw-jump-link” href=”#mw-head”>Jump to navigation</a>, <a class=”mw-jump-link” href=”#p-search”>Jump to search</a>] /wiki/ 문자열이 포함된 하이퍼링크: [<a class=”image” href=”/wiki/File:South_Korea_subway_logo.svg”><img alt=”South Korea subway logo.svg” data-file-height=”450″ data-file-width=”450″ decoding=”async” height=”75″ src=”//upload.wikimedia.org/wikipedia/commons/thumb/1/12/South_Korea_subway_logo.svg/75px-South_Korea_subway_logo.svg.png” srcset=”//upload.wikimedia.org/wikipedia/commons/thumb/1/12/South_Korea_subway_logo.svg/113px-South_Korea_subway_logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/12/South_Korea_subway_logo.svg/150px-South_Korea_subway_logo.svg.png 2x” width=”75″/></a>, <a class=”image” href=”/wiki/File:Seoul-Metro-2004-20070722.jpg”><img alt=”Seoul-Metro-2004-20070722.jpg” data-file-height=”2100″ data-file-width=”2800″ decoding=”async” height=”169″ src=”//upload.wikimedia.org/wikipedia/commons/thumb/2/29/Seoul-Metro-2004-20070722.jpg/225px-Seoul-Metro-2004-20070722.jpg” srcset=”//upload.wikimedia.org/wikipedia/commons/thumb/2/29/Seoul-Metro-2004-20070722.jpg/338px-Seoul-Metro-2004-20070722.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/29/Seoul-Metro-2004-20070722.jpg/450px-Seoul-Metro-2004-20070722.jpg 2x” width=”225″/></a>, <a href=”/wiki/Seoul_Subway_Line_2″ title=”Seoul Subway Line 2″>Line 2</a>] class 속성으로 추출한 하이퍼링크: [<a class=”external text” href=”http://www.seoulmetro.co.kr/kr/board.do?menuIdx=548″ rel=”nofollow”>”자료실 : 알림마당>자료실>자료실”</a>, <a class=”external text” href=”http://www.korail.com/file/statistics/2012/2012-04.pdf” rel=”nofollow”>2012 Korail Statistics</a>, <a class=”external text” href=”https://web.archive.org/web/20140227072212/http://www.korail.com/file/statistics/2012/2012-04.pdf” rel=”nofollow”>Archived</a>] |