[codeit] 꿈의 직장 전화번호 모으기 II

SUNGJIN KIM·2021년 11월 30일
0

codeit

목록 보기
10/18

문제

생각해 보니 오렌지 보틀 지점의 전화번호에 더해서, 지점 이름(지점이 위치한 도시)과 주소도 있으면 도움이 될 것 같습니다. 오렌지 보틀의 웹사이트에 가서, 모든 지점의 이름, 주소, 그리고 전화번호를 branch_infos 리스트에 저장해 주세요.

한 지점에 대한 지점 이름, 주소, 전화번호를 리스트 형식으로 branch_infos에 넣어 주세요.

실행 코드

가져오는 것 자체는 크게 어렵지 않았다.
(이전 강의내용을 들어보면 데이터를 가져오는데 있어서 어려움이 없다.)

처음에는 select를 사용해서 get_text()라고 코드를 작성하였는데 아래와 같이 오류 메시지가 노출되었다.

ResultSet object has no attribute 'get_text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

ResultSet 객체는 get_text의 속성을 가지고 있지 않는다는 것이였다.
추가적으로 더 확인해본 바는 다음과 같다.

get_text() 는 문서나 태그 내에서 사람이 읽을 수 있는 텍스트만 원하는 경우 사용할 수 있다.

Select의 경우에는 모든 데이터를 리스트 형식으로 반환을 한다면,
Select_one의 경우에는 태그형태로 사용될 수 있는 데이터의 값을 반환해준다.

위의 오류메시지에서 써있는 것처럼 단일요소로써 해당 값을 가져오는게 목적인데, 전체요소를 가져온 것이니 사용할 수 없다고 이해가 되었다.

위와 같이 코드가 짜여져 있다고 했을때, 결과값은 아래와 같다.

branch_info = soup.select('div.branch')
branch_info2 = soup.select_one('div.branch')

print(branch_info)
print(branch_info2)

1) Select를 사용하여 데이터를 받아오는 경우 (branch_info)

[<div class="branch">
<p class="city">San Jose</p>
<p class="ave">Fairway</p>
<p class="address">4823 Fairway Drive</p>
<img src="/images/orangebottle/phone_icon.png" width="20px"/>
<span class="phoneNum">707-514-0033</span>
</div>, <div class="branch">
<p class="city">GREAT BARTON</p>
<p class="ave">Lammas</p>
<p class="address">106 Lammas Street</p>
<img src="/images/orangebottle/phone_icon.png" width="20px"/>
<span class="phoneNum">070 3460 5076</span>
</div>, <div class="branch">
<p class="city">Hamilton</p>
<p class="ave">Bridgeport</p>
<p class="address">3791  Bridgeport Rd</p>
<img src="/images/orangebottle/phone_icon.png" width="20px"/>
<span class="phoneNum">905-389-4463</span>
</div>]

2) select_one을 사용하여 데이터를 받아오는 경우 (branch_info2)

<div class="branch">
<p class="city">San Jose</p>
<p class="ave">Fairway</p>
<p class="address">4823 Fairway Drive</p>
<img src="/images/orangebottle/phone_icon.png" width="20px"/>
<span class="phoneNum">707-514-0033</span>
</div>

전체 작성 코드

import requests
from bs4 import BeautifulSoup

url = "https://workey.codeit.kr/orangebottle/index"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')

branch_infos = []
branch_info = soup.select('div.branch')

for tag in branch_info:
    branch_name = tag.select_one('p.city').get_text()
    address = tag.select_one('p.address').get_text()
    phone_number = tag.select_one('span.phoneNum').get_text()
    branch_infos.append([branch_name, address, phone_number])

print(branch_infos)

참고 : https://www.crummy.com/software/BeautifulSoup/bs4/doc/#get-text

profile
#QA #woonmong

0개의 댓글