• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    해결됨

네이버 뉴스 본문 링크 질문

22.07.22 15:33 작성 조회수 237

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 한개로 만들어도 되고, 두개 이상으로 만들어도 됩니다.

 

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

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