Programming,  Python

[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>]

Leave a Reply

Your email address will not be published. Required fields are marked *