인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

최지훈님의 프로필 이미지
최지훈

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

N번째 태그만 선택하기

네이버 뉴스 본문 링크 질문

해결된 질문

작성

·

313

1

안녕하십니까,
뉴스본문 기사 크롤링 중 질문이 있습니다.

첨부사진을 보시면, 첫번째 a태그의 class가 info press인데,
명령어를 입력하실 때 그냥 links = article.select("a.info")로 info만 입력하셨습니다.

띄어쓰기 전의 한 단어만 class 명으로 보는 것인지 궁금합니다.

 

아래는 강사님을 따라한 코드입니다(크롤링 결과는 잘 나옴)

# 1. 삼성전자를 검색하고, 네이버 뉴스 본문의 링크만 가져온다
response = requests.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90")
html = response.text
soup = BeautifulSoup(html, "html.parser")
articles = soup.select("div.info_group") # 뉴스 기사 중 div가 info_group인 것을 선택해라.
# info_group이 총 몇개인지 확인하니까, word에 나와 있듯이 총 기사가 10개임을 확인했다.

for article in articles:
    links = article.select("a.info") # article의 a태그 중 class가 info인 녀석들을 가져오자.
    if len(links) >= 2: # 가져온 결과값은 리스트 형태이고, word에 나와 있듯이 네이버 뉴스는 a태그 2개로 구성되어 있다. 따라서 links의 리스트 중 len함수를 통해 리스트가 몇개인지 파악하고, 링크가 2개 이상인지 확인한다.
        url = links[1].attrs["href"] # 우리가 가져올 건 link 중 2번째 요소니까, [1]을 입력한다(리스트 인덱스는 0부터 시작하니까!)
        # print(url) 본문 링크만 가져온다면 여기서 마치면 되지만, 우리가 원하는건 본문 내용이다.

# 2. 네이버 뉴스 본문 내용 가져오기
        response = requests.get(url, headers={'User-agent' : 'Mozila/5.0'}) # 방금 만든 url에 다시 requests를 사용!, 봇으로 인식되는걸 피하기 위한 header도 넣자.
        html = response.text
        soup = BeautifulSoup(html, "html.parser")
        # print(soup)를 통해 제대로 본문을 가져오는지 확인해보자
        content = soup.select_one("#newsct_article") # 네이버뉴스의 본문을 모두 포함하는 것은 id newsct_article 이다.
        print(content.text)

 

답변 1

0

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

태그에 class가 두개 이상인 경우 띄어쓰기로 구분해서 작성합니다.

 

그리고 CSS 선택자를 만들 때,

class 한개로 만들어도 되고, 두개 이상으로 만들어도 됩니다.

 

즉, 한개로 내가 원하는 태그를 선택할 수 있으면 한개만 써도 되고

여러 개를 써야할 상황이면 여러개를 써야 합니다.

최지훈님의 프로필 이미지
최지훈

작성한 질문수

질문하기