"파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문" (*위키북스)중 스크래핑 관련 예제를 참고합니다. 설명이 자세하고 예제 설명도 비교적 잘되어 나중에라도 참고할까 싶어서 남깁니다.


from bs4 import BeautifulSoup
from urllib.request import *
from urllib.parse import *
from os import makedirs
import os.path, time, re

proc_files = {} # 이미 처리한 파일인지 확인하기 위한 빈 변수
def enum_links(html, base) :
soup = BeautifulSoup(html, "html.parser")
print("soup = ", soup)
links = soup.select("link[rel='stylesheet']")
print("links = ", links)
links += soup.select("a[href]")
print("links+ = ", links)
result = []
for a in links : # href 속성을 추출하고, 링크를 절대 경로로 변환
href = a.attrs['href']
url = urljoin(base, href)
result.append(url)
return result

def download_file(url) :
o = urlparse(url)
print("o = ", o)
savepath = "./" + o.netloc + o.path
if re.search(r"/$", savepath) :
savepath += "index.html"
savedir = os.path.dirname(savepath)
if os.path.exists(savepath) : # 모두 다운로드되었는지 확인
return savepath
if not os.path.exists(savedir) : # 다운로드 받을 폴더 생성
print("mkdir = ", savedir)
makedirs(savedir)
try : # 파일 다운받기
print("download = ", url)
urlretrieve(url, savepath)
time.sleep(1)
return savepath
except :
print("download fail : ", url)
return None

def analyze_html(url, root_url) : # html을 분석하고 다운받는 함수
savepath = download_file(url)
if savepath is None :
return
if savepath in proc_files : # 이미 다운로드 받았다면 실행하지 않음.
return
proc_files[savepath] = True
print("analyze_html =", url)
html = open(savepath, "r", encoding = "utf-8").read()
links = enum_links(html, url)
for link_url in links :
if link_url.find(root_url) != 0 :
if not re.search(r".css$", link_url) :
continue
if re.search(r".(html|htm)$", link_url) :
analyze_html(link_url, root_url)
continue
download_file(link_url)

if __name__ == "__main__" :
url = "https://docs.python.org/3.5/library/"

analyze_html(url, url) 


선택자를 잘 사용하면 구조가 복잡한 HTML 페이지라도 한 번에 원하는 데이트를 추출할 수 있습니다.


- 선택자 기본 서식

 서식 

 설명 

 *

 모든 요소를 선택합니다. 

 <요소 이름>

 요소 이름을 기반으로 선택합니다. 

 .<클래스 이름>

 클래스 이름을 기반으로 선택합니다.

 #<ID 이름>

 ID 속성을 기반으로 선택합니다.


- 선택자들의 관계 지정식

 서식 

 설명 

 <선택자>, <선택자> 

 쉼표로 구분된 여러 개의 선택자를 모두 선택합니다. 

 <선택자> <선택자>

 앞 선택자의 후손 중 뒤 선택자에 해당하는 것을 모두 선택합니다.

 <선택자> > <선택자>

 앞 선택자의 자손 중 뒤 선택자에 해당하는 것을 모두 선택합니다.

 <선택자> + <선택자> 

 같은 계층에서 바로 뒤에 있는 요소를 선택합니다.

 <선택자1> - <선택자2>

 선택자1부터 선택자2까지의 요소를 모두 선택합니다.


- 선택자 속성을 기반 지정식

 서식

 설명

 <요소>[<속성>]

 해당 속성을 가진 요소를 선택합니다. 

 <요소>[<속성>=<값>]

 해당 속성의 값이 지정한 값과 같은 요소를 선택합니다.

 <요소>[<속성>~=<값>]

 해당 속성의 값이 지정한 값을 단어로 포함(띄어쓰기로 구분해서 완전히 포함)하고 있다면 선택합니다.

 <요소>[<속성>|=<값>]

 해당 속성의 값으로 시작하면 선택합니다.(이때 하이픈 기호(※)로 구분해서 확인합니다.)  

 <요소>[<속성>^=<값>]

 해당 속성의 값이 지정한 값으로 시작하면 선택합니다.

 <요소>[<속성>$=<값>]

 해당 속성의 값이 지정한 값으로 끝나면 선택합니다.

 <요소>[<속성>*=<값>]

 해당 속성의 값이 지정한 값을 포함하고 있다면 선택합니다.


- 위치 또는 상태 지정식

 서식

 설명

 <요소>:root

 루트 요소

 <요소>:nth-child(n)

 n번째 자식 요소

 <요소>:nth-last-child(n)

 뒤에서부터 n번째 자식 요소 

 <요소>:nth-of-type(n)

 n번째 해당 종류의 요소

 <요소>:first-child

 첫 번째 자식 요소 

 <요소>:last-child

 마지막 번째 자식 요소

 <요소>:first-of-type

 첫 번째 해당 종류의 요소 

 <요소>:last-of-type

 마지막 번째 해당 종류의 요소 

 <요소>:only-child

 자식으로 유일한 요소 

 <요소>:only-of-type 

 자식으로 유일한 종류의 요소 

 <요소>:empty

 내용이 없는 요소

 <요소>:lang(code)

 특정 언어로 code를 지정한 요소 

 <요소>:not(s)

 s 이외의 요소 

 <요소>:enabled

 활성화된 UI 요소

 <요소>:disabled

 비활성화된 UI 요소

 <요소>:checked

 체크돼 있는 UI 요소를 선택합니다. 





Microsoft의 무선 디스플레이 어댑터 구입 후 3년 정도 잘 쓰다가 노트북을 교체하면서 새로 연결하려고 하다보니 연결이 되지 않는 것입니다. 허걱 노트북 눈탱이 맞았나 싶어서 이것 저것 설정 바꾸어가면서 연결하려고 온갖 노력을 다 해보았습니다.


(아래 그림의 제품이 제가 사용하는 제품입니다.)

(보아하니 최신형은 4K까지 지원되나 봅니다.)

 어댑터 문제인가 싶어서 기존에 쓰던 노트북과 핸드폰으로 연결을 시도해 보았습니다. 잘 됩니다. 주말 내내 이것과 씨름하느라 주말을 훌쩍 보내버렸습니다. 다음날 레노버에 전화해보니 윈도우 고유 기능이라 PC 제조사에서는 해줄 수 있는 게 없다며 Microsoft Call 센터 전화번호를 문자로 찍어줍디다. 속으로는 많이 괘씸했습니다. 기본적인 기능 시험은 하고 출하해야 하는 것은 아닌가 싶어서 빈정도 상했습니다. 그러나 생각해보니 PC에 연결할 수 있는 셀 수 없이 많은 Device에 대한 호환성 시험이 가능한 일은 아닐 것 같습니다. 일단 윈도우 업데이트 전에 PC 제조사 사이트를 뒤져가며 온갖 드라이버를 모두 업데이트했고, 진단 프로그램도 깔아보고 DxDiag.exe도 실행해서 기능 지원 이상 여부도 확인했는데 전혀 문제될 만한 게 없었습니다. 윈도우 최신 업데이트까지 마치고도 안되니 막막했습니다. 

 다음 날 다시 출근 시간을 늦추고 마이크로 소프트 Call 센터에 전화를 했습니다.(1577-9700, 평일 9시부터) 수리 관련 콜센터 전화해보면 일반적으로 겪게 되는 담당 부서 떠넘기기 신공에 4번 정도 통화를 했던 것 같습니다. 회사 네이밍에 비해 전화 응대는 그다지 선진적이지는 못한 것 같습니다. 윈도우 부서, 서피스 부서, 다른 부서로 계속 전화 돌리다가 엑세서리 담당으로 넘어가니 어찌어찌 가능한 방법들에 대한 이메일을 받을 수 있었으나, 이 또한 연결 문제로 웹 검색을 통해 찾아봤던 그 내용 그대로여서 많이 실망스러웠습니다.

 오늘 퇴근 후 다시 연결 문제를 고민하던 중 갑자기 떠오르는 생각이 연결되는 PC를 통해 어댑터 펌웨어 업데이트를 해보는게 좋겠다는 생각이 불현듯 드는 것입니다. 딸내미 자는 틈에 잠시 PC를 빌려서 어댑터 연결 후 어댑터 앱을 통해 최신 버젼으로 업데이트가 가능하였습니다. 와~~ 잘 하면 되겠는데 하는 기대감에 가슴이 부풀어 올랐습니다.


(윈도우키 + K를 눌러 무선 디스플레이 어댑터와의 연결을 시도합니다.)


(기존 화면이 아래와 같습니다.)


(아래 그림과 같이 시작화면이 업데이트 후 바뀐 것을 확인할 수 있었습니다.)


3일 고생한 끝에 결국 성공했습니다. 이 기능 없어도 노트북 사용하는데 전혀 지장 없는데 난 왜 이런 것에 이렇게 집착하는지 한심스럽기도 하지만, 하는 일 마다 눈에 띄는 성과를 보여주는게 없어서 그런지 자꾸 집착하게 되네요. 요즘은 집 청소하는게 가장 보람됩니다. 청소는 하는 족족 성과가 눈에 보이거든요. 나이는 자꾸 먹어가는데 손에 쥔 건 없고 그럴 수록 이런 눈에 보이는 결과물에 집착하는 것은 아닌지.

암튼 오늘은 편히 잘 수 있겠어요.


'IT' 카테고리의 다른 글

Type-C USB3.0 멀티허브 HDMI PD LAN 9 in 1 DS3403UHCL  (0) 2021.01.17
CSS 선택자 종류 및 설명  (0) 2020.12.01
Lenovo IdeaPad Flex 5 구매  (0) 2020.10.08
구글 애드센스 승인 절차-4  (0) 2020.10.01
구글 애드센스 승인 절차-3  (0) 2020.08.16

+ Recent posts