๊ฐœ์ธ๊ณต๋ถ€/Python

100. ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ (5)html ๊ธฐ๋ณธ

LEE_BOMB 2022. 1. 8. 21:11
html?

ํƒœ๊ทธ ์ด๋ฆ„ / ์†์„ฑ(attribute) 2๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ
* ํƒœ๊ทธ ์ด๋ฆ„ : ํƒœ๊ทธ๋ฅผ ์ƒ์ง•ํ•˜๋Š” <> ๊ธฐํ˜ธ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ์ •๋ณด ex) p, li, img (html์€ ํ•ญ์ƒ ์—ด๊ณ  ๋‹ซ๋Š” <ํƒœ๊ทธ><ํƒœ๊ทธ/>๋กœ ๊ตฌ์„ฑ)
* ์†์„ฑ : ํƒœ๊ทธ๊ฐ€ ๊ฐ€์ง„ ์ถ”๊ฐ€์ •๋ณด. ์†์„ฑ ์ด๋ฆ„ & ์†์„ฑ ๊ฐ’์ด ํ•˜๋‚˜์˜ ์Œ ex) name = "value"


1.1 ๊ธฐ๋ณธ ํƒœ๊ทธ - html, head, body
html ๋ฌธ์„œ์ธ ๊ฑธ ํ‘œ์‹œํ•˜๋Š” <html></html>
ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜, ๋ฌธ์„œ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์“ฐ๋Š” <head></head>
์›น ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์“ฐ์ด๋Š” <body></body>๋กœ ๊ตฌ์„ฑ
* <html><head><body> ํƒœ๊ทธ๋Š” ํ•ญ์ƒ ์žˆ์–ด์•ผ ํ•จ

1.2 ๊ธฐ๋ณธ ํƒœ๊ทธ (๋ฌธ์ž) - p, h1
<p></p> : ๋ฌธ์ž๋ฅผ ์ ์„ ๋•Œ ์“ฐ๋Š” ํƒœ๊ทธ

<h1></h1> : ๋ฌธ์ž๋ฅผ ์ ์„ ๋•Œ ์“ฐ๋Š” ํƒœ๊ทธ. h1์€ ๋ฌธ์ž์˜ ํฌ๊ธฐ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ๋‹ค (h1,h2,h3,h4,h5,h6 ๊ฐ™์ด ์ ์  ์ž‘์€ ํฌ๊ธฐ์˜ ๋ฌธ์ž๋ฅผ ํ‘œ์‹œ)

1.3 ๊ธฐ๋ณธ ํƒœ๊ทธ ํ™œ์šฉํ•ด๋ณด๊ธฐ - img, a href, input
<a></a> a ํƒœ๊ทธ : ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์— ๋งํฌ๋ฅผ ๊ฑธ ๋•Œ
input ํƒœ๊ทธ : ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ. (๋ฒ„ํŠผ ์ƒ์„ฑ ์‹œ ์‚ฌ์šฉ ex. <input></input>)
img ํƒœ๊ทธ : ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ex. <img src=""/>


2. css - html ์Šคํƒ€์ผ๋ง
html ํƒœ๊ทธ๋ณ„๋กœ ์Šคํƒ€์ผ๋ง ๊ฐ€๋Šฅ

2.1 html, css - id์™€ class์˜ ์ฐจ์ด์ 

id, class ๋ชจ๋‘ html ์†์„ฑ์„ ๊ตฌ๋ถ„ํ•  ๋•Œ ์‚ฌ์šฉ

id์™€ class๋ฅผ ํ†ตํ•ด html ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ๊พธ๋ฏธ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
* id๋Š” <p id="my-id"> </p> ๊ฐ™์€ ์‹์œผ๋กœ ์ž‘์„ฑ, class๋Š” <p class="textStyle"></p> ์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ

css์—์„œ๋Š” ์›ํ•˜๋Š” id์™€ class๋งŒ ์Šคํƒ€์ผ๋ง ํ•ด์ค„ ์ˆ˜ ์žˆ์Œ
id๋Š” #id๋กœ ํ‘œ๊ธฐ, ํด๋ž˜์Šค๋Š” .class๋กœ ํ‘œ๊ธฐ

2.3 CSS - ์ž์‹ ํƒœ๊ทธ์— ์ ‘๊ทผํ•˜๊ธฐ
p em์€ em์ด p๋ณด๋‹ค ์•ˆ์ชฝ์— ์žˆ๋Š” ๊ฒฝ์šฐ๋ฉด ๋‹ค ํ•ด๋‹น
๋ฐ˜๋ฉด > ๊ธฐํ˜ธ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ์•ˆ์ชฝ์— ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ํ•ด๋‹น

 

 

ํŒŒ์‹ฑ? (Parsing)

์–ด๋–ค ํŽ˜์ด์ง€(๋ฌธ์„œ, html ๋“ฑ)์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ํŒจํ„ด์ด๋‚˜ ์ˆœ์„œ๋กœ ์ถ”์ถœํ•ด ๊ฐ€๊ณตํ•˜๋Š” ๊ฒƒ

์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ถ„ํ•ดํ•˜๋Š” ๊ฒƒ!

 

 

 

์„ ํƒ์ž ๊ฒฝ๋กœ ์ฐพ๊ธฐ

์„ ํƒ์ž? HTML์˜ ํƒœ๊ทธ๋“ค์— ์ด๋ฆ„์„ ๋งŒ๋“ค์–ด ์Šคํƒ€์ผ์‹œํŠธ๋กœ ์ œ์–ดํ•˜๋Š” ์—ญํ• 

html์˜ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•ด์„œ ์ง์ ‘ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๊ฒƒ (์Šทํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ณต์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์„ ๋•Œ ์œ ์šฉ)

copy๋ฅผ ์ด์šฉํ•ด ์„ ํƒ์ž(selecor) ๊ฒฝ๋กœ๋ฅผ ๋ณต์‚ฌ (๋‹จ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์„ ๋•Œ ์œ ์šฉ)

  ํด๋ž˜์Šค id
์„ ํƒ์ž .ํด๋ž˜์Šค๋ช… #ID
๊ฐ€๋Šฅํ•œ ๊ฐœ์ˆ˜ ์—ฌ๋Ÿฌ ๊ฐœ ๋‹จ ํ•œ ๊ฐœ
์žฅ์  ๋˜‘๊ฐ™์ด ์ƒ๊ธด ๋ฆฌ์ŠคํŠธ ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”์ถœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ์ˆ˜์ง‘๋  ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ
๋‹จ์  ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ ์ถ”์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฒ€์ฆ ํ•„์š” ์—ฌ๋Ÿฌ ์š”์†Œ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Œ



 

 

 

๊ด€๋ จ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

1. requests

import requests

HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ์š”์ฒญํ•˜๊ณ  HTML ์ฝ”๋“œ๋ฅผ ๋ฐ›์Œ

์–ด๋–ค ๋ฐฉ์‹(method)์˜ HTTP ์š”์ฒญ์„ ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ์„œ ํ•ด๋‹นํ•˜๋Š” ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

GET ๋ฐฉ์‹: requests.get()
POST ๋ฐฉ์‹: requests.post()
PUT ๋ฐฉ์‹: requests.put()
DELETE ๋ฐฉ์‹: requests.delete()

- requests ๋ชจ๋“ˆ์˜ get() ํ•จ์ˆ˜๋Š” ์‘๋‹ต (Response) ๊ฐ์ฒด๋ฅผ ๋Œ๋ ค์คŒ (status_code, text, url, headers ๋“ฑ)
- response๋œ ๊ฐ์ฒด์˜ ์š”์†Œ๋“ค ์ค‘ text ์š”์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด html ์ฝ”๋“œ์˜ ํ…์ŠคํŠธ๊ฐ€ ๋ถˆ๋Ÿฌ์™€์ง„๋‹ค
- html.select() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด html ๋ณ€์ˆ˜์— ๋‹ด๊ธด HTML ๋ฌธ์„œ ์•ˆ์—์„œ ์ž…๋ ฅ๋œ ์„ ํƒ์ž๋ฅผ ๊ฐ–๋Š” ์š”์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ ํƒ€์ž…์œผ๋กœ ๋ชจ๋‘ ๊ฐ€์ ธ์˜จ๋‹ค

* HTML๋ณ€์ˆ˜.select('์„ ํƒ์ž')์˜ ๊ฒฐ๊ณผ๋Š” ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ๋ฅผ ์ƒ์ •ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜

 

 

 

2. Beautiful Soup

from bs4 import BeautifulSoup

์›น ํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํŒŒ์ด์ฌ ์šฉ์–ด๋กœ ๋ฐ”๊ฟ”์ค˜์„œ ์‰ฝ๊ฒŒ ์Šคํฌ๋ž˜ํ•‘์ด ๊ฐ€๋Šฅ
html.parser, lxml๊ณผ ๊ฐ™์€ parser๋ฅผ ํ†ตํ•ด ํŒŒ์‹ฑํ•จ์œผ๋กœ์„œ ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ ์ƒ์„ฑ

 

.prettify() : ๋ฌธ์„œ ๊ณ„์ธต๊ตฌ์กฐ ์กฐํšŒ

.select_one : 1๊ฐœ์˜ ํƒœ๊ทธ๋งŒ ๋ฐ˜ํ™˜
.select : ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๋ฐ˜ํ™˜


.find() : 1๊ฐœ์˜ ํƒœ๊ทธ๋งŒ ๋ฐ˜ํ™˜
.find_all() : ๋ชจ๋“  a ํƒœ๊ทธ๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜

 

.title : title ํƒœ๊ทธ ๋ฐ˜ํ™˜

.title.name : title ํƒœ๊ทธ์˜ ์ด๋ฆ„(‘title’)์„ ๋ฐ˜ํ™˜

.title.string : title ํƒœ๊ทธ์˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
.title.parent.name : title ํƒœ๊ทธ์˜ ๋ถ€๋ชจ ํƒœ๊ทธ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜


.p : ์ฒซ pํƒœ๊ทธ ๋ฐ˜ํ™˜
.p[‘class’] : ‘class’ ์†์„ฑ์ด ์žˆ๋Š” ์ฒซ p ํƒœ๊ทธ๋ฅผ ๋ฐ˜ํ™˜


.a : a ํƒœ๊ทธ๋ฅผ ๋ฐ˜ํ™˜
.get() : href ์†์„ฑ์„ ๋ฐ˜ํ™˜
.get_text() : html ๋ฌธ์„œ ์•ˆ์— ์žˆ๋Š” ํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜






์ฐธ๊ณ 

https://codetorial.net/beautifulsoup/basics.html

https://beautiful-soup-4.readthedocs.io/en/latest/

https://realpython.com/python-requests/

https://www.daleseo.com/python-requests/
https://book.coalastudy.com/data-crawling/week-1/stage-4