inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

텍스트를 기준으로 찾아야하는 상황

None tpye 에러가 발생해서 if문을 여러번 작성했는데 줄이는 방법이 있나요?

150

이세용

작성한 질문수 1

0

# warning 어쩌구 뜨면 쓰는건데 굳이 안써도 됨
import urllib3
urllib3.disable_warnings()

# text None Type 에러 일 시 header를 추가해준다.
# SSLdError 발생 시 verify옵션 추가해준다.

header = {
    'User-Agent' : 'Mozilla/5.0',
    'Referer' : 'https://www.riss.kr/search/Search.do?isDetailSearch=N&searchGubun=true&viewYn=OP&queryText=&strQuery=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&exQuery=&exQueryText=&order=%2FDESC&onHanja=false&strSort=RANK&p_year1=&p_year2=&iStartCount=0&orderBy=&mat_type=&mat_subtype=&fulltext_kind=&t_gubun=&learning_type=&ccl_code=&inside_outside=&fric_yn=&db_type=&image_yn=&gubun=&kdc=&ttsUseYn=&l_sub_code=&fsearchMethod=&sflag=1&isFDetailSearch=N&pageNumber=1&resultKeyword=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&fsearchSort=&fsearchOrder=&limiterList=&limiterListText=&facetList=&facetListText=&fsearchDB=&icate=re_a_kor&colName=re_a_kor&pageScale=100&isTab=Y&regnm=&dorg_storage=&language=&language_code=&clickKeyword=&relationKeyword=&query=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5'
}

for article in articles:
    title = article.select_one(".title > a").text
    link = 'https://www.riss.kr' + article.select_one(".title > a").attrs['href']

    # 상세 페이지로 요청
    response = requests.get(link, headers=header, verify=False)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')

    # 2. 순서를 기준으로 찾기
    if soup.find('span', string='발행기관'):
        press = soup.find('span', string='발행기관').find_next_sibling().text # find_next_sibling 옆에 있는 명령어를 찾아라 라는 명령문
    else:
        press = []
    if soup.find('span', string='발행연도'):
        year = soup.find('span', string='발행연도').find_next_sibling().text
    else:
        year = []
    if soup.find('span', string='주제어'):
        keywords = soup.find('span', string='주제어').find_next_sibling().text.split(';' '')
        keywords_result = []
        for keyword_for in keywords:
            keywords_result.append(keyword_for.strip())
    else:
        keywords = []
    print(title, link, press, year, keywords_result)

    # result = []
    # for keyword in keywords:
    #     result.append(keyword.strip())

python 웹-크롤링

답변 2

0

스타트코딩

AI 인턴이 말한대로 함수를 사용하면

여러번 반복하지 않고 코드를 간결하게 만들 수 있습니다.

 

또한 if-else 표현식을 사용해서 한줄의 코드로 작성할 수도 있어요 ㅎㅎ

press = soup.find('span', string='발행기관').find_next_sibling().text if soup.find('span', string='발행기관') else None
year = soup.find('span', string='발행연도').find_next_sibling().text if soup.find('span', string='발행연도') else None

 

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

None Type 에러를 처리하는 방법으로 조건문을 여러 번 작성하는 대신, 함수를 사용하여 코드를 간결하게 만들 수 있습니다.

def get_text_or_default(soup, selector, default_value=[]):
    result = soup.find('span', string=selector)
    if result:
        return result.find_next_sibling().text
    else:
        return default_value

for article in articles:
    title = article.select_one(".title > a").text
    link = 'https://www.riss.kr' + article.select_one(".title > a").attrs['href']
    
    response = requests.get(link, headers=header, verify=False)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    
    press = get_text_or_default(soup, '발행기관')
    year = get_text_or_default(soup, '발행연도')
    keywords_string = get_text_or_default(soup, '주제어', '')
    keywords = [keyword_for.strip() for keyword_for in keywords_string.split(';') if keyword_for.strip()]
    
    print(title, link, press, year, keywords)

위 코드에서 get_text_or_default 함수는 찾고자 하는 태그가 존재할 경우 그 값을 반환하고, 없을 경우 기본값을 반환합니다. 기본값은 함수를 호출할 때 지정할 수 있습니다. 이를 통해 여러 번의 if 조건문을 작성하는 대신, 코드를 간결하게 유지하면서 필요한 정보를 추출할 수 있습니다.

셀레니움 환경설정 오류

0

52

2

네이버 로그인 관련

0

282

2

안녕하세요 셀레니움에 대해서 질문

0

89

1

크롤링 연습사이트 문의

0

102

2

선택자 질문

0

74

2

'특정 요소가 나타날 때까지 스크롤' 부분 에러

0

78

2

자동 로그인 질문

0

90

2

44강 제목, 링크

0

107

1

원하는 값이 없을 때

0

91

2

크롤링한 링크가 엑셀로 들어가면 작동이 안되요

0

230

2

셀레니움 PDF자료는 받을 수 있나요

0

100

2

글목록 추출하기

0

100

2

메일 자동화 로그인 중복방지문자해결 오류 및 명시적 대기 질문

0

91

2

강의 노트가 어디에 있는건가요?

0

80

2

강의 커리큘럼 질문

0

102

1

조건문 else 사용하지 않는 이유

0

77

2

셀레니움으로 접근할 수 없는 경우

0

98

2

웹페이지 변경

0

75

2

자바스크립트로 태그 선택 시 질문입니다.

1

65

2

수료증은 어떻게 받나요?

0

122

2

class명을 활용하여 선택자를 만들지 않는 경우..?

0

61

2

드라이버가 안 열려요

0

79

2

이거 해결방법 아시는 분?

0

121

2

네이버 지식인 크롤링..

0

202

2