๐Ÿ“‚์›น ๊ฐœ๋ฐœ(Web)/๐ŸํŒŒ์ด์ฌ(Python)

ํŒŒ์ด์ฌ ์›น ํฌ๋กค๋ง Beautiful Soup

๐Ÿ‘ฉ‍๐ŸŽ“์ธํ…”๋ฆฌ๊ฐ์ž๐Ÿฅ” 2023. 5. 9. 17:50

ํฌ๋กค๋ง๊ณผ ์Šคํฌ๋ž˜ํ•‘

ํฌ๋กค๋ง : ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ์ธํ„ฐ๋„ท์„ ํƒ์ƒ‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ
ํฌ๋กค๋ง: ํฌ๋กค๋Ÿฌ๊ฐ€ ์›นํŽ˜์ด์ง€๋“ค์„ ๋Œ์•„๋‹ค๋‹ˆ๋Š” ํ–‰์œ„
์Šคํฌ๋ž˜ํผ: ์›นํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ
์Šคํฌ๋ž˜ํ•‘: ์›นํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ํ–‰์œ„
=> ํ†ต์ƒ์ ์œผ๋กœ ํฌ๋กค๋ง๊ณผ ์Šคํฌ๋ž˜ํ•‘์„ ํ•ฉ์ณ์„œ ํฌ๋กค๋ง์ด๋ผ๊ณ  ํ‘œํ˜„ํ•จ

 

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ 

ํด๋ผ์ด์–ธํŠธ
-์›น ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น
์˜ˆ) ์Šค๋งˆํŠธํฐ ์•ฑ, ํฌ๋กฌ, ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ

์„œ๋ฒ„
-ํด๋ผ์ด์–ธํŠธ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ฃผ๋Š” ๊ฒƒ
-ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณต
-์ธํ„ฐ๋„ท ์ฃผ์†Œ์ฐฝ์— ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋Š” ํ–‰์œ„ 
=> ์„œ๋ฒ„์— ์ ‘์†

 

 

์‘๋‹ต์ฝ”๋“œ

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚œ ํ›„ ์ƒํƒœ์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ 

100๋ฒˆ๋Œ€ 200๋ฒˆ๋Œ€ 300๋ฒˆ๋Œ€ 400๋ฒˆ๋Œ€ 400๋ฒˆ๋Œ€
์กฐ๊ฑด๋ถ€ ์‘๋‹ต ์„ฑ๊ณต ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์™„๋ฃŒ ์š”์ฒญ ์˜ค๋ฅ˜ ์„œ๋ฒ„ ์˜ค๋ฅ˜
-ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ถ€๋งŒ ํฌํ•จํ•œ ์ฑ„๋กœ ๋ณด๋‚ด์„œ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ๋ณด๋‚ด๋‹ฌ๋ผ๊ณ  ํ•˜๋Š” ์‘๋‹ต์ฝ”๋“œ -์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‘๋‹ต์ฝ”๋“œ -ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…์ด ๋‚จ์•„์žˆ๋Š” ์ฝ”๋“œ

-๋ณดํ†ต ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•œ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‘๋‹ต์ฝ”๋“œ
-ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์ž˜๋ชป๋์„ ๋•Œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‘๋‹ต์ฝ”๋“œ

-๋ฌธ์ œ ๋ฐœ์ƒ์˜ ์›์ธ์ด ํด๋ผ์ด์–ธํŠธ์— ์žˆ๋‹ค๋Š” ๋œป
-์„œ๋ฒ„์˜ ์„ค์ •, ์ฝ”๋“œ ๋“ฑ์˜ ๋ฌธ์ œ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ์ฝ”๋“œ

 

400๋ฒˆ๋Œ€, ์ฃผ๋กœ ์ฃผ์†Œ๊ฐ€ ์‚ฌ๋ผ์กŒ์„ ๋•Œ 404 not found๊ฐ€ ๋œฌ๋‹ค.

 

์ƒˆ๋กœ๊ณ ์นจ์ด๋ž€?

๋ฃธ ํด๋ฆฌ๋‹์ด ์•„๋‹ˆ๋ผ, ๋˜‘๊ฐ™์ด ์ƒ๊ธด ๋˜ ๋‹ค๋ฅธ ๋ฐฉ์„ ๋งŒ๋“ค์–ด ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ.

300๋ฒˆ๋Œ€ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

Url ๊ตฌ์กฐ 

ํ†ต์‹  ํ”„๋กœํ† ์ฝœ = ํ†ต์‹  ๊ทœ์•ฝ : ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•

- ์ธํ„ฐ๋„ท์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ http, https

-๊ทธ ์™ธ์— FTP, SFTP, SSH ๋“ฑ์ด ์žˆ๋‹ค.

 

์ฃผ์†Œ ๋˜๋Š” IP

- ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ํƒ€๊ฒŸ

 

ํฌํŠธ๋ฒˆํ˜ธ: ๊ณตํ•ญ ๊ฒŒ์ดํŠธ ๊ฐ™์€ ๊ฒƒ

์•ฝ์† ๋˜์–ด ์žˆ์ง€ ์•Š์€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ ‘์†์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ

 ์ฟผ๋ฆฌ์ŠคํŠธ๋ง : ? ์ดํ•˜

์„œ๋ฒ„์— ์š”์ฒญ

์ œ๋Œ€๋กœ ๋œ ๋ฐ์ดํ„ฐ์ธ์ง€ ๋ฌป๊ฑฐ๋‚˜ ํ•  ๋•Œ ์”€

+์„ค๋ช… ์ถ”๊ฐ€

์ฟผ๋ฆฌ์ŠคํŠธ๋ง(Query String)์€ ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์›น ์„œ๋ฒ„๊ฐ€ ์›น ์„œ๋ฒ„์—๊ฒŒ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด URL์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์€ ์ผ๋ฐ˜์ ์œผ๋กœ ? ๊ธฐํ˜ธ๋กœ URL์˜ ๊ฒฝ๋กœ์™€ ๊ตฌ๋ถ„๋˜๋ฉฐ, & ๊ธฐํ˜ธ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ์ŠคํŠธ๋ง์€ ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ํ‚ค-๊ฐ’ ์Œ์€ = ๊ธฐํ˜ธ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, https://example.com/search?q=apple&page=2์™€ ๊ฐ™์€ URL์—์„œ ? ์ดํ›„์— ์˜ค๋Š” q=apple&page=2 ๋ถ€๋ถ„์ด ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, q์™€ page๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ๊ฐ’์€ apple๊ณผ 2์ž…๋‹ˆ๋‹ค.

 

์›น ํฌ๋กค๋ง ๋ฐฉ์‹

1. ์ •์  ํฌ๋กค๋ง

์–ด๋Š ์ƒํ™ฉ์—์„œ๋‚˜ ๊ฐ™์€ ์ฃผ์†Œ์—์„œ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

์ˆ˜์ง‘ ๋Œ€์ƒ์— ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋‚˜ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

์‚ฌ์šฉ ๋ชจ๋“ˆ: BeautifulSoup

 

2. ๋™์  ํฌ๋กค๋ง

-์ž…๋ ฅ, ํด๋ฆญ ๋“ฑ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ–‰ํ•˜๋Š” ํ–‰๋™๋“ค์„ ํ•ด์•ผ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

-์ˆ˜์ง‘ ๋Œ€์ƒ์— ํ•œ๊ณ„๊ฐ€ ์ ์œผ๋‚˜ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

-์‚ฌ์šฉ ๋ชจ๋“ˆ: Selenium

 

์†๋„๊ฐ€ ๊ฝค ๋งŽ์ด ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.

ex) 24์‹œ๊ฐ„์— 1000๊ฐœ(๋™์ )->10๋ถ„์— 1000๊ฐœ(์ •์ ) ์„ฑ๋Šฅ UP!

 

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ํ˜ผ์šฉํ•ด์„œ ์“ฐ๊ธฐ๋„ ํ•จ

 

DOM(Document Object Model) tree

https://poiemaweb.com/js-dom

DOM: ์›น ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๋Š” ๊ฒƒ

DOM tree: HTML ๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•œ ํ›„ ํŒŒ์‹ฑํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋ธ

 

์‹ค์Šต

ํ—ค๋”๋ž€?

์ฟ ํŒก์•„์ €์”จ๊ฐ€ ์ƒˆ๋ฒฝ๋ฐฐ์†ก ์˜ค๊ธฐ ์ „์— ๋ณด๋‚ด์ฃผ๋Š” ๋ฌธ์ž ๊ฐ™์€ ๊ฒƒ. ํƒ๋ฐฐ๋Š” body, ๋จผ์ € ๋ณด๋‚ด์ฃผ๋Š” ๋ฌธ์ž๋Š” header.

์ €์žฅ ๋˜๊ฑฐ๋‚˜ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋ก์˜ ๋งจ ์•ž์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค.

 ํƒœ๊ทธ 

 

๋ฉ”ํƒ€ ํƒœ๊ทธ

ํƒ€์ดํ‹€ ํƒœ๊ทธ

 

# ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— res.text์—์„œ ํ•œ๊ธ€์ด ๊นจ์ง€๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ 
print(res.content)

 

์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

res = rq.get(url, params = {"key1" : "value1", "key2" : "value2"})
print(res.url)

params๋ž€?

params๋Š” HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ์ด์ฌ์—์„œ๋Š” requests ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, URL ๋’ค์— ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด params ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉ

 

 

#urllib์œผ๋กœ ์›นํŽ˜์ด์ง€ ์ ‘์†

from urllib.request import urlopen

url = "https://www.naver.com"

page = urlopen(url)

print(page)



print(page.code)

print(headers)

print(page.url)

print(page.read())

 

 # ์ •์  ํฌ๋กค๋ง ๋ชจ๋“ˆ

from bs4 import BeautifulSoup
from urllib.request import urlopen

BeautifulSoup์€ ์š”์ฒญ ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜จ HTML ์ฝ”๋“œ๋ฅผ ํŒŒ์ด์ฌ์ด ์“ธ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ•  

BeautifulSoup์€ HTML, XML ๋“ฑ์˜ ๋งˆํฌ์—… ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ , ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ด์ฌ์—์„œ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(GPT์ถœ์ฒ˜)

url = "http://www.naver.com"

page = urlopen(url)

soup = BeautifulSoup(page, "lxml")

"lxml" << ํŒŒ์„œ, ํŒŒ์‹ฑ์ด๋ž€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ํŒจํ„ด์ด๋‚˜ ์ˆœ์„œ๋กœ ์ถ”์ถœํ•˜์—ฌ ์ •๋ณด๋ฅผ ๊ฐ€๊ณตํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ

-lxml , html5lib, html.parser ๋“ฑ์ด ์žˆ๋‹ค.

lxml: C์–ธ์–ด๋กœ ๊ตฌํ˜„๋˜์–ด ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค.

html5lib: ์›น๋ธŒ๋ผ์šฐ์ € ํ˜•ํƒœ๋กœ HTML์„ ๋ถ„์„ํ•˜์—ฌ ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋Š๋ฆฌ๊ณ  ๊ฐ€์žฅ ์•ˆ์ •์ ์ด๋‹ค.

html.parser: lxml๊ณผ html5lib์˜ ์ค‘๊ฐ„ ์†๋„์ด๋‹ค. 

 

์†์„ฑ ๋ฐ์ดํ„ฐ

html = """<html> <head><title class="t" id="ti">test site</title></head> <body> <p>test</p> <p>test1</p> <p>test2</p> </body></html>"""

<html> ~ </html> ๊นŒ์ง€ ๋‹ซํ˜€์žˆ๋‹ค.

 html ๋‚ด๋ถ€์—์„œ <head> ์ž์‹ ํƒœ๊ทธ๊ฐ€ ์—ด๋ฆฌ๊ณ  ๋‹ซํžŒ๋‹ค.

 

-html(๊ฐ€์žฅ ์ƒ์œ„)

    -head

         -title (class "t" id "ti")๋Š” ์†์„ฑ, id๋Š” ๊ณ ์œ ํ•œ ๊ฐ’, ๋™์ผํ•œ id๋Š” ๋‘ ๋ฒˆ ๋“ฑ์žฅํ•  ์ˆ˜ ์—†๋‹ค

   -body ํƒœ๊ทธ๋Š” head ํƒœ๊ทธ์™€ ๋™๋“ฑํ•œ ์œ„์น˜, head์™€ body ํƒœ๊ทธ๋Š” ํ˜•์ œ ํƒœ๊ทธ

        -p

        -p

        -p

soup = BeautifulSoup(html, "lxml")

soup
<html> <head><title class="t" id="ti">test site</title></head> <body> <p>test</p> <p>test1</p> <p>test2</p> </body></html>

 

tag_title = soup.title

print(tag_title)
print(tag_title.attrs) # ํƒœ๊ทธ์˜ ์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ
print(tag_title["class"]) # ๋”•์…”๋„ˆ๋ฆฌ ์ฒ˜๋Ÿผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋”•์…”๋„ˆ๋ฆฌ ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ,
ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
print(tag_title["id"])
<title class="t" id="ti">test site</title>
{'class': ['t'], 'id': 'ti'}
['t']
ti

 

ํƒœ๊ทธ ์ ‘๊ทผ

soup.ํƒœ๊ทธ์ด๋ฆ„ ์˜ ํ˜•ํƒœ๋กœ ์ฒซ ๋ฒˆ์งธ๋กœ ๋“ฑ์žฅํ•˜๋Š” ํƒœ๊ทธ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ

 ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

 

# text์™€ string์˜ ์ฐจ์ด 

tag_body = soup.body



data_text = tag_body.text

data_string = tag_body.string



pring(tag_body)

print("text :", data_text, type(data_text)) #ํ•˜์œ„ ํƒœ๊ทธ๋“ค์˜ ๊ฐ’๋„ ๋ชจ๋‘ ์ถœ๋ ฅ

print("string :", data_string, type(data_string)) # ์ •ํ™•ํžˆ ํ•ด๋‹น ํƒœ๊ทธ์— ๋Œ€ํ•œ ๊ฐ’๋งŒ ์ถœ๋ ฅ

text: ํ•˜์œ„ ํƒœ๊ทธ๋“ค์˜ ๊ฐ’๋„ ๋ชจ๋‘ ์ถœ๋ ฅ
string: ์ •ํ™•ํžˆ ํ•ด๋‹น ํƒœ๊ทธ์— ๋Œ€ํ•œ ๊ฐ’๋งŒ ์ถœ๋ ฅ

tag_body.p
<p>test</p>
tag_body.p.string
'test'

 

# ์›ํ•˜๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ find_all()

-์›ํ•˜๋Š” ํƒœ๊ทธ๋“ค์„ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

 

-html
    -head
        -title
    -body
        -p
        -p
        -p
        -a
        -b

 

html = """<html> <head><title>test site</title></head> <body> <p id="i" class="a">test1</p><p id="d" class="d">test2</p><p class="c">test3</p></p><a>a tag</a> <b>b tag</b></body></html>"""
soup = BeautifulSoup(html, "lxml")
soup.find_all("title")
[<title>test site</title>]

ํ•˜๋‚˜๋ฐ–์— ์—†๋‹ค๊ณ  ํ• ์ง€์–ธ์ • ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ๋‚˜์˜จ๋‹ค.

soup.find_all("p")
[<p class="a" id="i">test1</p>,
 <p class="d" id="d">test2</p>,
 <p class="c">test3</p>]
soup.find_all("p")[1]
<p class="d" id="d">test2</p>

์ธ๋ฑ์Šค ์Šฌ๋ผ์ด์‹ฑ ํ•˜๊ธฐ

soup.find_all(id = "d")
[<p class="d" id="d">test2</p>]

id์˜ ์กด์žฌ ์—ฌ๋ถ€๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

# id์˜ ์กด์žฌ ์—ฌ๋ถ€๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
soup.find_all(id = True)
[<p class="a" id="i">test1</p>, <p class="d" id="d">test2</p>]

์›ํ•˜๋Š” ํƒœ๊ทธ, ์›ํ•˜๋Š” id ๊ฐ’์œผ๋กœ ํƒœ๊ทธ ๊ฐ€์ ธ์˜ค๊ธฐ

# ์›ํ•˜๋Š” ํƒœ๊ทธ, ์›ํ•˜๋Š” id ๊ฐ’์œผ๋กœ ํƒœ๊ทธ ๊ฐ€์ ธ์˜ค๊ธฐ

print(soup.find_all("p", id = "d"))
[<p class="d" id="d">test2</p>]

์—†๋Š” ๋ฐ์ดํ„ฐ >> none

print(soup.find_all("p", id = "c"))
[]
soup.find_all("p", class_ = "c")[0].text
'test3'

 

# find()

-ํ•˜๋‚˜์˜ ์š”์†Œ๋งŒ ๊ฐ€์ ธ์˜ด
-์ฐพ๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ

์˜ˆ) id ๊ฐ’์œผ๋กœ ์ ‘๊ทผ

print(soup.find("p", class_ = "d"))
print(soup.find("p", id = "i"))
print(soup.find(id = "i"))
<p class="d" id="d">test2</p>
<p class="a" id="i">test1</p>
<p class="a" id="i">test1</p>

 

๋ฐ”๋”” ํƒœ๊ทธ ์•ˆ์—์„œ๋งŒ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ?

์—ฐ์†์œผ๋กœ find ํ•จ์ˆ˜ ์‚ฌ์šฉ

soup.find("body").find("p", class_ = "d")
<p class="d" id="d">test2</p>

 

Select๋Š” ๋‚ด์ผ ์ด์–ด์„œ...!!!