innate
50
2021-05-18 23:38:37
2
117

파이썬 초보 xml 크롤링 관련 질문드립니다.


import urllib.request
from bs4 import BeautifulSoup
import csv


melonList = []
for a in range(010):
    url = 'https://stdict.korean.go.kr/api/view.do?key=zzzzzzz&method=target_code&q=' + str(a)
    req = urllib.request.Request(url)
    html = urllib.request.urlopen(req).read()
    soup = BeautifulSoup(html'html.parser')

    lst50 = soup.select('word_info'# 필요한 필드값을 가져옴
    lst51 = soup.select('lexical_info')
    lst52 = soup.select('pos_info')
    lst53 = soup.select('sense_info')
    lst54 = soup.select('example_info')

    for i in lst50 or lst51 or lst52 or lst53:
        temp = []
        temp.append(i.select_one(str('word')).text)
        temp.append(i.select_one(str('word_unit ')).text.replace('\t','').replace('\r\n',''))
        temp.append(i.select_one(str('word_type')).text.replace('\t','').replace('\r\n',''))
        temp.append(i.select_one(str('pos')).text.replace('\t','').replace('\r\n',''))
        temp.append(i.select_one(str('type')).text.replace('\t','').replace('\r\n',''))
        temp.append(i.select_one(str('definition')).text.replace('\t','').replace('\r\n',''))
        temp.append(i.select_one(str('example')).text.replace('\t','').replace('\r\n',''))
        melonList.append(temp)
        

            

        
    with open('koreacsv.csv''w'encoding='utf-8-sig'newline=''as f:
        writer = csv.writer(f)
        writer.writerow(['단어','구성단위','고유어','명사','일반어','정의','예시'])
        writer.writerows(melonList)

실행결과가 이러합니다
AttributeError: 'NoneType' object has no attribute 'text'

크롤링하는 과정에서 각열에 위치한 설명란이 공백이면 "공백입니다"를 넣고싶은대 
어떤 방법으로 코딩하는게 좋을까요??
등록된 xml 예시는 이러합니다/..



0
  • 답변 2

  • JadeKim
    259
    2021-05-19 00:12:22

    제가 질문을 잘 이해했는지는 모르겠지만 다음과 같이 예외처리로 구현하면 될 거 같습니다.

    for i in lst50 or lst51 or lst52 or lst53:
            temp = []
            for j in ['word', 'word_unit ', 'word_type', 'pos', 'type', 'definition', 'example']:
                try:
                    temp.append(i.select_one(j).text.replace('\t','').replace('\r\n',''))
                except:
                    print("공백입니다.")
    
            melonList.append(temp)

    그리고 "lst50 or lst51 or lst52 or lst53"는 [lst50, lst51, lst52, lst53]로 수정해도 되지않을까요?? 또 str('word')에서 str은 왜 해주셨는지 모르겠습니다. 'word'가 이미 string인데...

  • innate
    50
    2021-05-19 03:22:15

    str 선언은 무작정 여러 영상 참고 겸 따라하다가 적었어요..

    아! 예외처리가 있었구나 리스트 값 바꾸기나 공백이면 해당 열에 "공백입니다" 값넣기위주로 찾고있었는대..

    정말 감사합니다!!!

  • 로그인을 하시면 답변을 등록할 수 있습니다.