마지막 예에서 사용한 두 표현 모두 속성이 존재하지 않는다면 오류가 발생한다. 태그를 추출하기 전에 tag.has_attr() 함수를 사용해서 속성이 존재하는지 꼭 확인하자. 다음 구문은 BeautifulSoup과 리스트 내포를 결합해 웹 페이지에 포함된 모든 링크와 그에 연결된 URL, 레이블을 추출한다(재귀적인 웹 크롤링(recursive web crawling)에 유용하다).
with urlopen("http://www.networksciencelab.com/") as doc:
soup = BeautifulSoup(doc)
links = [(link.string, link["href"])
for link in soup.find_all("a")
if link.has_attr("href")]
links
links 값은 튜플의 리스트다. 코드를 실행하면 다음 값이 나온다.
[('Network Science Workshop',
'http://www.slideshare.net/DmitryZinoviev/workshop-20212296'),
≪…생략…≫,('Academia.edu',
'https://suffolk.academia.edu/DmitryZinoviev'), ('ResearchGate',
'https://www.researchgate.net/profile/Dmitry_Zinoviev')]
HTML/XML의 장점은 폭넓은 사용성이지만, 이는 단점이기도 하다. 특히 테이블형 데이터를 다룰 때 그러하다. 다행하게도 여러분은 테이블형 데이터를 안정적이고 쉽게 가공할 수 있는 CSV 파일에 저장할 수 있다. 다음 UNIT에서 더 자세히 알아보자.
* HTML 웹 문서를 만드는 데 사용하는 기본적인 프로그래밍 언어
* 하이퍼링크 인터넷에 나타나는 다른 웹 사이트와 연결되어 있는 글. 이 글을 클릭하면 바로 웹 사이트로 연결
* 웹 크롤링 조직적이고 자동화된 방법으로 웹을 탐색하고 자료를 모으는 것. 스파이더링(spidering)이라고도 함
크롤링 무수히 많은 컴퓨터에 분산 저장된 문서를 수집해 검색 대상의 색인으로 포함하는 기술