본문 바로가기

Computer/Programing

Parsing - Python

INSTALLATION


#Raspberrypi stretch full version 에서는 beautifulsoup 내장함, lite version 에서는 별도 설치 필요

#beautifulsoup4 및 bs4 설치 및 활용

#beautifulsoup4는pip3에서 설치
sudo apt-get install python3-pip
sudo pip3 install beautifulsoup4

#bs4는 python2 에서 설치해야됨
sudo apt-get install python-pip
sudo pip install bs4

#파이썬을 실행하여 프롬프트에 >>> from bs4 import BeautifulSoup 을 쳐도 에러가 발생하지 않는다면 정상적으로 설치된것



UrlLib 또는 requests 로 사이트를 불러와서 beautifulsoup 또는 RE 로 parsing 함









1. READ WEB DATA





REQUESTS

#python3 에서 사용가능, python3 urlib2가 작동하지 않아서 requests 사용
# -*- coding: UTF-8 -*-

import requests

import bs4

 

res = requests.get('http://heeseop.com/')

res.raise_for_status()

res.encoding='euc-kr'

html = res.text

 

soup = bs4.BeautifulSoup(html, 'html.parser')






# the second, By requests

# -*- coding: UTF-8 -*-

import requests

from bs4 import BeautifulSoup

TargetURL = 'http://Target.site'
res = requests.get(TargetURL)

soup = BeautifulSoup(res, "html.parser") print(soup)




#With Session


import requests

from bs4 import BeautifulSoup as bs


with requests.Session() as s:

    first_page = s.get('http://target.site')

    html = first_page.text

    print(html)








 URLLIB 

#python2 에서는 urllib2, python3에서는 urllib3 를 사용한다?? << 확인


# -*- coding: UTF-8 -*-

import urllib2

from bs4 import BeautifulSoup

TargetURL = "https://target.site"

res = urllib2.urlopen(TargetURL)

soup = BeautifulSoup(res, "html.parser") print(soup)


#python3 예제 urllib2 와 urllib3는 다른 명령어를 갖는다

from bs4 import BeautifulSoup

import urllib3 

http = urllib3.PoolManager()

url = 'http://target.site'

response = http.request('GET', url)

soup = BeautifulSoup(response.data)

print(soup)






URLLIB 두번째

#python3 에서 사용가능

import urllib.request

TargetURL = "https://target.page/"

res = urllib.request.Request(TargetURL)

response = urllib.request.urlopen(res)

page = response.read().decode("utf-8")

print(page)






2. PARSING 


# all 이 없을경우 첫번째값 추출, 포함할 경우 array 로 모든 수 포함

함수 = soup.find("a")
함수 = soup.find_all("a")

함수 = soup.find(id="ABC")
함수 = soup.find_all(id="ABC")

함수 = soup.find(class_="ABC")
함수 = soup.find_all(class_="ABC")

# 태그 제외 텍스트만 추출
함수 = 함수.get_text()


# 태그로 찾기 (첫번째 항목)

mr = soup.find("a")
print mr.get_text() # get_text() 함수는 도큐먼트 혹은 특정 태그 밑에 있는 모든 텍스트를 추출한다
print mr.string
  
# 태그로 찾기 (모든 항목)
mr = soup.find_all("a")
print mr[0]
  
# id로 찾기
mr = soup.find(id="AUTHOR")
print mr.get_text()
  
# class로 찾기
mr = soup.find(class_="bash")
print mr.get_text()
mr = soup.find("code", class_="bash") # id와 class를 조합하여 찾을 수도 있다
print mr.get_text()

# 특정 태그내의 class로 찾기, 예를들어 <td class=""> 인 경우
weather2 = tblweather.find_all('td',class_='')


# href 주소만 가져오고싶을때
함수 = soup.find("a").get('href')



# <span> 중에 텍스트가 습도인 항목을 찾아서 태그와 함께 함수에 저장
함수 = cdetail.find_all("span", text="습도")





# 특정 태그 제외1
cair = soup.find(class_="cont_air")
# cair에서 txt_unit class를 선택한 뒤에 여기에 해당되는 텍스트만 .clear()통해서 삭제, 나중에 .get_text()를 통해서 태그는 정리하면 됨.
pm25_unit_remove = cair.find(class_='txt_unit')
pm25_unit_remove.clear()



# 특정 태그 제외2
# ↓ class가 today인 태그를 선택
today = soup.find(class_="today")
# ↓ 그 중에서 txt_temp 태그를 선택
ctemp = today.find(class_="txt_temp")
# ↓ ctemp 함수에서 span 태그를 별도로 빼냄
ctemp_remove = ctemp.span.extract()
# 그러면 ctemp 에는 span 이 제외된 html코드만 남고, ctemp_remove 에는 span 태그만 남는다

# DIV 의 class값이 are_newsstand 범위만 지정
news_stand = soup.findAll("div", {"class":"area_newsstand"})

  
# 찾기 결과에 대해 다시 한번 찾기를 수행할 수 있다
tables = soup.find("ul")
mr = tables.find("li")
print mr

http://devnauts.tistory.com/120



 BEAUTIFULSOUP EXAMPLES  


# <p> 중에 info_temperature 안에 todaytemp 에 해당되는 태그를 제외한 텍스트 값을 ctemp 에 저장

ctemp = soup.find('p', class_='info_temperature').find('span', class_='todaytemp').text



# input태그 중에서 name이 _csrf인 것을 찾아서 value값을 가져옴
csrf = soup.find('input', {'name': '_csrf'}) 
<input type="hidden" name="_csrf" value="123132-2323-483e-13123-131232"/>



sampleURL3 = "http://HERE"

res = urllib2.urlopen(sampleURL3)

soup3 = BeautifulSoup(res, "html.parser")

htmltext = str(soup3)

m = re.search(r'(temp=\"\d\d\")', htmltext)

m2 = str(m.group(0))

m3 = m2.replace("temp=", "")

ctemp = m3.replace("\"","")




 RE 

#정규식 파싱

# 참조 : https://blog.heeseop.com/82

# 참조 : https://regexr.com/

# r'(이안에서 찾아)' 이라는 표현은 정규식에서 찾으라는 것

# 따옴표(") 앞에는 \를 써줘야함


import re


m = re.search(r'(temp=\"\d\d\"|temp=\"\d\"|temp=\"\-\d\d\"|temp=\"\-\d\")', soup)

hum = re.search(r'(humidity=\"\d\d\")', soup)



wcode = re.findall(r'(code=\"\d\d\")', soup)

wdate = re.findall(r'(day=\"\S\S\S\")', soup)

whigh = re.findall(r'(high=\"\d\d\"|high=\"\d\")', soup)

wlow = re.findall(r'(low=\"\d\d\"|low=\"\d\")', soup)

wlow = re.findall(r'(low=\"\d\d\"|low=\"\d\"|low=\"\-\d\d\"|low=\"\-\d\")', soup)


chumidity = re.findall(r'(Humidity<\/span><\/label><span><span class=\"txt\">(\d\d|\d)\%<\/span>)', str(soup))