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

강호성님의 프로필 이미지
강호성

작성한 질문수

파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)

CSS selector 사용해서 크롤링하기1 (업데이트)

50강 / 7분 14초 / selector

작성

·

318

0

selector를 최대한 strict하게 주어도 selector의 중복으로 제가 원하는 데이터만 추출이 여렵습니다

제가 원하는건 여기서 '(왕초보) - 클래스 소개' 데이터만 가져오는 것인데 어떻게 하나요?

items가 리스트 형식으로 저장되니 반복문을 쓰지 않고 바로 인덱스 값을 주어서 추출하긴 했는데

이 방법 말고 첫번째 사진, items를 반복문으로 출력한 item에서 '(왕초보) - 클래스 소개'를 추출하는 방법이 있을까요?

++++++++++++++++++++++++)

추가로 태그 안에 있는 텍스트를 출력할 때 .get_text()와 .string이 같다고 하셨는데 그냥 .text해도 똑같이 출력 되더라구요

같은건가요???????????????

답변 4

1

아 지금 강의 들으니 select()로 추출하면 좀 더 깔끔하네요.

1. index로 검색

import requests 

from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test')

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

items = soup.select('ul#hobby_course_list li')

for index, item in enumerate(items):

    if index == 0: # 원하는 index를 주면 됨.

        print(item.get_text())

2. 원하는 단어로 검색

import requests 

from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test')

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

items = soup.select('ul#hobby_course_list li')

for item in items:

    words = item.get_text().split('-')[1].split()

    for word in words:

        if word == "클래스": # 원하는 문자를 주면 됨.

            print(item.get_text())

그리고, 그냥 첫번째를 원하시는 거면, 다음 강의에 나오는 select_one 을 사용하시면 되네요. ^^

강사님 이 글 보실지 모르지만,  강의 감사합니다. 꾸벅

1

저도 공부삼아 두 가지 방법으로 접근해 봤는데요. 

1.  몇 번째 것을 뽑고 싶다. index 번호가 일치하는 것 추출

import requests 

from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test')

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

ulSoup = soup.find('ul', id='hobby_course_list')

titles = ulSoup.find_all('li', 'course')

for index, title in enumerate(titles):

    if index == 0: # 원하는 index를 주면 됨.

        print(title.get_text())

2. 원하는 단어를 추출 

첫번째 for문에서 단어를 분리하고, 단어리스트를 가지고 for문을 한번 더 돌려서 내가 원하는 단어가 있는지 비교

import requests 

from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test')

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

ulSoup = soup.find('ul', id='hobby_course_list')

titles = ulSoup.find_all('li', 'course')

for title in titles:

    words = title.get_text().split('-')[1].split()

    for word in words:

        if word == "클래스": # 원하는 문자를 주면 됨.

            print(title.get_text())

아직 배우는 중이라 더 좋은 방법이 있을 것 같은데... 

일단, 지금까지 강사님께 배운 내용을 토대로 제가 아는 범위내에서 풀어봤습니다.

0

@강호성님 

추출조건이 특정 keyword가 들어간 문자열이 아니라 정해진 위치라면..

인터넷을 뒤져보니 처음 질문하셨던 방법대로 리스트의 몇 번째로 바로 접근하시는 것이 좋지 싶네요.

구글링하다보니 몇 번째 요소에 접근하는 nth-of-type이란 것도 있네요. 덕분에 많이 공부했네요.

import requests 

from bs4 import BeautifulSoup

res = requests.get('https://davelee-fun.github.io/blog/crawl_test')

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

item = (soup.select_one('ul#hobby_course_list li:nth-of-type(4)'))

print(item.get_text())

0

강호성님의 프로필 이미지
강호성
질문자

답변 감사합니다 ^ㅁ^

맨 첫번째인 '(왕초보) - 클래스 소개'를 추출 하는거면 select_one으로 가능한데

4번째인 '(왕초보) - 초간단 페이지 만들어보기'를 원하면 어떻게 하나요?

답변을 기반으로 생각해보면 원하는 단어로 추출이 좋아보이긴 하는데 더 좋은 방법이 있나해서요

아무튼 제가 몰랐던 enumerate method도 알아가고 많은 도움이 됐습니다 감사합니다!!

강호성님의 프로필 이미지
강호성

작성한 질문수

질문하기