<복습>
https://wook-2124.tistory.com/27
<준비물>
https://github.com/psf/requests
https://www.crummy.com/software/BeautifulSoup/
<코드기록>
# 설치한 beautifulsoup4를 이용!
import requests
from bs4 import BeautifulSoup
indeed_result = requests.get("https://www.indeed.com/jobs?q=python&limit=50")
indeed_soup = BeautifulSoup(indeed_result.text, "html.parser")
print(indeed_soup)
# pagination 숫자 20을 찾아봄 (1~20)
# {}는 속성(attribute)를 부여해줌
pagination = indeed_soup.find("div", {"class":"pagination"})
print(pagination)
# pages를 list로 해서 a(anchor) 들을 찾아봄
pages = pagination.find_all('a')
print(pages)
# a(anchor)안에있는 span만 뽑아내기!
pages = pagination.find_all('a')
for page in pages:
print(page.find("span"))
# 최종 코드
# sapns를 [](list)로 묶어서 리스트에 있을 "span"만 찾아서 append(추가)해줌, 그리고 기계는 0부터 세고 마지막 Next수치는 -1 !!
import requests
from bs4 import BeautifulSoup
indeed_result = requests.get("https://www.indeed.com/jobs?q=python&limit=50")
indeed_soup = BeautifulSoup(indeed_result.text, "html.parser")
pagination = indeed_soup.find("div", {"class":"pagination"})
pages = pagination.find_all('a')
spans = [] #list
for page in pages:
spans.append(page.find("span"))
print(spans[0:-1])
1. beautiful soup 활용하기
from bs4 import BeautifulSoup으로 기능을 수입해오고!
soup = BeautifulSoup(html_doc, "html.parser")
여기서 soup의 명칭을 indeed_soup으로 바꾸고 html_doc은 requests를 이용해서 얻어낸 indeed_result를 text화 시켜준 값을 입력하면 끝!
미리 최종 코드를 보자면 밑에 코드표처럼 된다.
import requests
from bs4 import BeautifulSoup
indeed_result = requests.get("https://www.indeed.com/jobs?q=python&limit=50")
indeed_soup = BeautifulSoup(indeed_result.text, "html.parser")
print(indeed_soup)
이렇게 from bs4 import BeautifulSoupfmf 통해 기능을 수입해주고
soup = BeautifulSoup(html_doc, 'html.parser')에서 soup 명칭을 바꾸고, html_doc을 indeed_result.text로 requests로 얻어낸 결과값을 text화 해주고 출력하면 터미널에 저렇게 출력이 된다!
2. BeautifulSoup의 여러 함수기능들
soup.p에서 p는 paragraph(단락), soup.find_all('a')에서 a는 anchor(웹 하이퍼링크의 출발지와 도착지)라고 생각하면 된다. 그리고 soup.find_all('a')는 List [] 기반으로 되있어서 출력하게 되면 [_____] 이런식으로 출력된다.
3. pagination 값 구하기
indeed 홈페이지에서 F12 혹은 오른쪽 마우스의 검사(inspection)를 통해서 밑에 1~20 순서를 클릭하는 것이 div class="pagination" 이라는 것을 알아 수 있다.
함수기능 중 soup.find(id="link3")을 이용해보자.
pagination = indeed_soup.find("div", {"class":"pagination"}) 이라는 코드를 짜게 되는데, 여기서 indeed_soup는 indeed_result에서 따온 url을 text로 만들어준 것을 뜻하고, 우리는 여기서 "div"코드 안에 있는 class:"pagination"을 찾는다고 해석하면된다. 즉 soup.find(id="link3") 에서 soup는 indeed_soup가 되고, id="link3"는 div 안에있는 class="pagination"이 되는 것이다.
# pagination 숫자 20을 찾아봄 (1~20)
# {}는 속성(attribute)를 부여해줌
pagination = indeed_soup.find("div", {"class":"pagination"})
print(pagination)
4. soup.find_all('a') - a(anchor)
이번엔 soup.find_all('a')를 이용해보자.
inspection으로 오른쪽 터미널에 보이는 a href에서 a가 anchor이다.
1부터 20까지 구하려는 것을 pages로 묶은 뒤 pagination안에 있는 모든 anchor를 찾으려는 코드는
# pages를 list로 해서 a(anchor) 들을 찾아봄
pages = pagination.find_all('a')
print(pages)
이렇게 쓸 수 있다!
함수를 이용해서 오른쪽 터미널에 보이는 web에 적혀있는<span class="pn"> 20 을 찾을 수 있다. (pages는 list!)
5. a(anchor)안에 있는 span 찾기
근데 우리는 a herf 안에 있는 span class만 찾으면 된다.
# a(anchor)안에있는 span만 뽑아내기!
pages = pagination.find_all('a')
for page in pages:
print(page.find("span"))
위의 코드를 통해서 a herf 안에 내재되있던 span class만 뽑아냈는데, 여기서 for page in pages:는 page라고 새로 정의한 이름으로 pages안에 있는 "span"을 찾아서 print하라! 라고 생각하면 된다.
터미널에서 1이 안나온 이유는 현재 내가 접속해있는 page가 1이기 때문이다.
# sapns를 [](list)로 묶어서 리스트에 있을 "span"만 찾아서 append(추가)해줌
spans = [] #list
for page in pages:
spans.append(page.find("span"))
print(spans)
spans를 []화 시키고 다시 한번 for page in pages:로 page라는 이름을 생성하고 pages에서 뽑아낸 anchor에서 "span"만 find해서 append(추가)해서 출력했다.
6. 20 순서 뒤에있는 Next 없애기
소제목 그대로 Next는 우리가 구할 필요가 없는 pagination이다. 때문에 지워주도록 하자.
기계는 0부터 숫자를 세기때문에 0이 2page 라고 생각하면 된다. 때문에 내가 보고있는 첫 페이지에서 -1을 해주면 가장 뒤에있는 Next가 나오는 것이다. (2page에서 pagination 값을 구해서 2page라고 뜬거 같음!)
spans[0:-1]은 0(2page)부터 출력은 하는데 -1(Next)만 제외하라는 뜻이 된다.
다시 말하면, 0~Next 전의 값! 이 된다.
또 굳이 0(2page)를 붙이지 않고 :(except) -1(Next)만 적어줘도 except Next가 된다고 생각하면된다!!
또 한번 정리하자면, 0부터 "-1(Next)전"까지!!!
사실 이부분이 이해가 잘 안되서 정리하면서 다시 코드를 작성해봤다.. ㅠㅠ
그리고 0이 2page인 이유는 내가 2page에서 pagination을 찾았기 때문이다!! (확인했음ㅋㅋ)
즉, spans[18]을 입력하면 20값이 나올 것이고, spans[19]를 입력하면 Next값이 나올 것이다.
때문에 spans[0:-1] = spans[0:19]는 같다고 생각하면된다!
하지만 페이지가 적어서 19의 값을 알 수 있는 것이지... 더 많다고 가정하면 그냥 -1을 적어서 마지막 Next를 없애는게 더 효율적이다.
spans[0:9]는 0부터 9전인 8까지, 즉 0~8을 의미하게 된다.
print(spnas) 0, 1, 2, 3, 4, 5, 6, 7, 8
<span class="pn"> 2, 3, 4, 5, 6, 7, 8, 9, 10
이렇게 추가적으로 실험적으로 코드를 작성하고나서야 spans[0:-1]에 대해서 정확하게 이해했다...
이것은 0~마지막(Next)전까지 라는 뜻!!!
그리고 기계는 처음을 0부터 센다는 것을 잊으면 안된다!
그럼 다음시간에 이어서 정리해보도록 하겠다!! :)
# 최종 코드
# sapns를 [](list)로 묶어서 리스트에 있을 "span"만 찾아서 append(추가)해줌
# 그리고 기계는 0부터 세고 마지막 수치(Next)는 -1 !!
import requests
from bs4 import BeautifulSoup
indeed_result = requests.get("https://www.indeed.com/jobs?q=python&limit=50")
indeed_soup = BeautifulSoup(indeed_result.text, "html.parser")
pagination = indeed_soup.find("div", {"class":"pagination"})
pages = pagination.find_all('a')
spans = [] #list
for page in pages:
spans.append(page.find("span"))
print(spans[0:-1])
※ 코로나바이러스감염증-19 조심하세요!!!!
'Python > Web Scraping' 카테고리의 다른 글
[Python] #2.5 Requesting Each Page (#코딩공부) (0) | 2020.02.17 |
---|---|
[Python] #2.4 Extracting Indeed Pages part Two (#코딩공부) (0) | 2020.02.16 |
[Python] #2.2 Navigating with Python (#코딩공부) (0) | 2020.02.13 |
[Python] #2.0 What is Web Scraping / #2.1 What are We Building (#코딩공부) (0) | 2020.02.12 |
[Python] #1.13 Modules (#코딩공부 #모듈) (0) | 2020.02.11 |
댓글