• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    해결됨

AttributeError: 'NoneType' object has no attribute 'get_text' (공공 데이터 - 미세먼지 - 크롤링) 에러 질문 드립니다.

19.08.08 16:45 작성 조회수 9.06k

0

# 선생님 코드와 'stationname' -> 'cityName', 'pm10grade' -> 'pm10Value' 만 다를 뿐 (인증키 등 기본 정보도 다릅니다만) 유사한 코드를 작성했지만 get_text 에러가 발생했습니다. 처음에 print(res.text)를 해보니 해당 항목의 이름이 바뀌어서 저도 바꿨습니다. 
발생한 에러에 대한 구글 검색을 해보니 BeautifulSoup 에러 라는 말들이 보이긴 하는데, 왜 발생했고 어떻게 해결해야 할지 잘 모르겠습니다.

아래는 제가 작성한 코드 입니다.

import requests
from bs4 import BeautifulSoup

service_key = '발행한 인증키 값을 넣었습니다'
params = '&numOfRows=10&pageNo=1&sidoName=서울&searchCondition=DAILY'
open_api = 'http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getCtprvnMesureSidoLIst?ServiceKey=' + service_key + params

res = requests.get(open_api)
soup = BeautifulSoup(res.content, 'html.parser')

data = soup.find_all('item')
for item in data:
    cityname = item.find('cityName')
    pm10grade = item.find('pm10Value')
    print(cityname.get_text(), pm10grade.get_text())

답변 3

·

답변을 작성해보세요.

6

이화영님의 프로필

이화영

2019.08.15

저도 크롤링한 데이터의 변수명이 바뀌었길래

윗분과 똑같이 stationname' -> 'cityName' , 'pm10grade' -> 'pm10Value'

로 바꾸어서 진행했다가, 똑같은 오류가 발생했는데요.

 

그 이유가 파싱{ soup = BeautifulSoup(res.content, 'html.parser') }하기 전에 나온 데이터의 변수명인 'cityName' , 'pm10Value'를 사용했기 때문이더라고요. (동영상에서 print(res.text) 하고 나온 결과데이터)

 

동영상에서 설명해주신 것처럼, 

res = requests.get(open_api)

soup = BeautifulSoup(res.content, 'html.parser')

data = soup.find_all('item')

print(data)

를 하고 나서 결과데이터를 보면, 변수명이 cityname , pm10value 로 바뀐 것을 확인하실 수 있는데,

이걸 사용하시면 오류가 발생하지 않습니다.

 

혹시 저처럼 실수하시고서 헤매시는 분 있으실까봐 답변 남깁니다.

0

제가 어떤 부분을 오해 했는지 알게 됐습니다. 감사합니다!

0

안녕하세요.  우선 제가 작성한 코드를 기반으로 각자 원하시는 방향대로 조금씩 코드를 바꿔보려 하신 것은 굉장히 잘하신 것입니다.

해당 에러는 크롤링으로 추출한 다음 데이터중 하나가 xml 값이 없어서, 데이터를 추출하지 못한 것이예요

그러다보니, cityname이나 pm10grade 변수 값이 None 이 된 것이고, None 값에 get_text() 함수를 호출하니

None 값에는 get_text() 함수가 없다고 이야기한 것입니다.

추가로, 말씀하신대로, 각자 원하시는 코드를 만든 후, 해당 부분에 어떤 부분이 문제가 있고, 심지어 어떤 부분을 어떻게 바꿔야 하는지까지는 답변드리기가 어려워요. 왜냐하면 크롤링의 경우에는 각자 원하는 코드의 일부분이 잘못되었다고 한다면, 결국 이를 해결해야할 사람은 각자 원하는 크롤링 프로그램을 만들어야 하거든요. 이 부분을 프로그램까지 만들어서 답변드리게 되면, 오해아닌 오해로, 모든 수강생분들이 각자 원하는 사이트의 크롤링 프로그램을 문의할 것이고, 각자의 원하는 대로 크롤링 프로그램을 만들어드리기에는 현실적으로, 시간적으로 무리가 있기는 합니다. None 에러는 크롤링에서 다분히 자주 일어나는 에러이고, 이 때에는 자신이 크롤링하기 위해 선택한 부분이 잘못되었음을 확인하시면 좋을 것 같구요. 어떻게 해결해야할지 아예 코드상으로 작성해서까지 말씀드리기에는 현실적인 한계가 있는 부분은 꼭좀 양해를 부탁드립니다. 감사합니다.

    cityname = item.find('cityName')
    pm10grade = item.find('pm10Value')