python/webscraping

[Python webscraping] #4 BeautifulSoup

ohojee 2022. 12. 16. 18:01

 

전체 소스코드
from cgi import print_environ
from nturl2path import url2pathname
import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/index"
res = requests.get(url)
res.raise_for_status()

soup = BeautifulSoup(res.text, "lxml") # 가져온 html문서를 lxml paser를 통해 BeautifulSoup 객체로 만듦, soup이 모든 정보를 가지고 있음
# print(soup.title)
# print(soup.title.get_text())
# print(soup.a) # soup객체에서 첫번째로 발견된 a element 출력
# print(soup.a.attrs) # soup객체에서 첫번째로 발견된 a element의 속성 정보 ex)href, onclick ...
# print(soup.a["href"]) # 속성값 가져오고 싶을 때 [] 사용

# print(soup.find("a", attrs={"class":"Nbtn_upload"})) # a element에 해당하는 것 중 클래스 속성이 Nbtn_upload인 첫번째 element
# print(soup.find(attrs={"class":"Nbtn_upload"})) # Nbtn_upload이 하나밖에 없기 때문에 이렇게 써도 같은 결과 나옴

# print(soup.find("li", attrs={"class":"rank01"}))
# rank1 = soup.find("li", attrs={"class":"rank01"}) # soup을 통해 발견한 객체를 rank1 변수에 저장
# print(rank1.a.get_text())
# print(rank1.nextSibling.nextSibling) # 태그 사이 개행정보가 있어서 한 번만 쓰면 안 나올 수 있음, 그냥 두 번 써주면 됨
# rank2 = rank1.nextSibling.nextSibling
# rank3 = rank2.nextSibling.nextSibling
# print(rank3.a.get_text())
# rank2 = rank3.previous_sibling.previous_sibling
# print(rank2.a.get_text())
# print(rank1.parent)
# rank2 = rank1.find_next_sibling("li") # rank1 기준으로 li인 다음 정보만 찾음, 이러면 개행 때문에 고민할 필요 x
# print(rank2.a.get_text())
# rank3 = rank2.find_next_sibling("li")
# print(rank3.a.get_text())
# rank2 = rank3.find_previous_sibling("li")
# print(rank2.a.get_text())

# print(rank1.find_next_siblings("li")) # rank1 기준으로 다음 li형제들 모두 가져옴

webtoon = soup.find("a", text="나노마신-114. 제43장. 전력을 늘려라 (1)")
print(webtoon)
 
 

beautifulsoup4이 스크래핑을 하기 위해 사용될 패키지

lxml이 구문을 분석하는 paser

 

페이지를 잘 알고 있을 때 이렇게 사용할 수 있다

하지만 모르는 경우가 더 많다

이럴 때는 .find사용

태그 간 이동
rank2 = rank1.nextSibling.nextSibling
rank2 = rank1.find_next_sibling("li")

rank2 = rank3.previous_sibling.previous_sibling
rank2 = rank3.find_previous_sibling("li")
 

.nextSibling과 .previous_sibling를 사용하면 앞 뒤 태그로 이동할 수 있다

하지만 이 태그들은 만약 태그 사이 개행정보가 있어서 한 번만 쓰면 안 나올 수 있다

그러면 그냥 두 번 써주면 된다

.find_next_sibling(), .find_previous_sibling()를 사용한다면

rank1이나 rank3을 기준으로 li인 다음 정보만 찾는다

이러면 개행 때문에 고민할 필요가 없다