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

hhs0995님의 프로필 이미지
hhs0995

작성한 질문수

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

1단계 - class 선택자 고급 테크닉, 특수문자 처리 방법

'블랙핑크' 검색 시에만 오류가 뜨는 현상

작성

·

231

0

안녕하세요. 강사님 아래 코드에서 '블랙핑크' 를 검색할 때

Traceback (most recent call last):

File "c:\pratice_crolling\심화1_\03_스포츠 뉴스 크롤링.py", line 52, in <module>

print(article_title.text.strip())

^^^^^^^^^^^^^^^^^^

AttributeError: 'NoneType' object has no attribute 'text'

다음과 같은 오류가 뜹니다 ㅠㅠ CSS 선택자, 오타도 모두 맞게 확인이 되는데 왜 저 검색어만 오류가 뜰까요ㅠㅠ?

# -*- coding: euc-kr -*-
# 네이버에서 손흥민, 오승환과 같은 스포츠 관련 검색어 크롤링하기

import requests
from bs4 import BeautifulSoup
import pyautogui
import time

search = pyautogui.prompt("어떤 것을 검색하시겠어요?")

response = requests.get(f"https://search.naver.com/search.naver?sm=tab_hty.top&where=news&query={search}&oquery=%EC%98%B7%EC%9C%BC%ED%99%98&tqi=i74G%2FdprvTossZPeMhCssssssko-058644")
html = response.text
soup = BeautifulSoup(html, "html.parser")
articles = soup.select(".info_group")

for article in articles:
    # '네이버뉴스' 가 있는 기사만 추출한다. (<a> 하이퍼링크가 2개 이상인 경우에 해당)
    links = article.select("a.info")
    if len(links) >=2 :
        url = links[1].attrs['href']
        response = requests.get(url, headers={'User-agent':'Mozila/5.0'})
        html = response.text
        soup = BeautifulSoup(html, "html.parser")
        
        # 스포츠 기사인 경우
        if "sports" in url:
            article_title = soup.select_one("h4.title")
            article_body = soup.select_one("#newsEndContents")
            # 본문 내에 불필요한 내용 제거 p태그와 div태그의 내용은 출력할 필요가 없다. 없애주자.
            p_tags = article_body.select("p") # 본문에서 p 태그인 것들을 추출
            for p_tag in p_tags:
                p_tag.decompose()

            div_tags = article_body.select("div") # 본문에서 div 태그인 것들을 추출
            for div_tag in div_tags:
                div_tag.decompose()
        
        # 연예 기사인 경우
        elif "entertain" in url:
            article_title = soup.select_one(".end_tit")
            article_body = soup.select_one("#articeBody")
        
        # 일반 뉴스 기사인 경우
        else:
            article_title = soup.select_one("#title_area")
            article_body = soup.select_one("#dic_area")

        # 출력문
        print("==================================================== 주소 ===========================================================")
        print(url.strip())
        print("==================================================== 제목 ===========================================================")
        print(article_title.text.strip())
        print("==================================================== 본문 ===========================================================")
        print(article_body.text.strip()) #strip 함수는 앞 뒤의 공백을 제거한다.
        time.sleep(0.3)

답변 2

0

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

안녕하세요.

코딩을 가장 쉽게 알려주는 크리에이터 스타트코딩입니다!

 

코드 굉장히 잘 짜 주셨는데요!

"sports" in url 대신 response.url 로 바꿔야 합니다.

 

url 변수에 들어 있는 주소

https://n.news.naver.com/mnews/article/003/0011975667?sid=106

 

response.url 에 들어 있는 주소

https://entertain.naver.com/read?oid=003&aid=0011975667

 

비교가 되시죠?

url = links[1].attrs['href']

a 태그의 href 속성값을 가져오는 것이고 (실제 주소와 다를 수 있습니다)

 

response.url 은 실제로 요청을 보내고 받은 주소 값이 들어 있습니다. (실제 주소와 같습니다)

 

0

hhs0995님의 프로필 이미지
hhs0995
질문자

response.url 이 어떤 기능을 하는지, 어떨 때 써야하는지 알고 싶습니다!

hhs0995님의 프로필 이미지
hhs0995

작성한 질문수

질문하기