2013-08-10 5 views
2

저는 튜토리얼을 읽지 않고 단순히 파이썬을 처음 접했을뿐입니다. 실제로 실제 프로젝트를 완료하는 것이 더 좋은 방법이라고 생각합니다. 그러나, 내가 꽤 도움 (필요하게 될 것입니다 의미합니다. 지점에 지금라이브러리가 내장 된 파이썬 기본 웹 스크래퍼 만들기 - Python 초보자

프로세스가 간소화되지 않도록 내가 어떤 제 3의 라이브러리없이 웹 스크래퍼를 만들기 위해 노력하고있어 나를 위해, 그리고 내가 여러 온라인 리소스를 통해 보았다. 내가 뭐하는 거지 알고 있지만 이는 모두가 어떤 일에 대해 나를 혼란 남아있다.

있는 HTML이 다음과 같이 보입니다,

<html> 
<head>...</head> 
<body> 
    *lots of other <div> tags* 
<div class = "want" style="font-family:verdana;font-size:12px;letter-spacing:normal""> 
<form class ="subform">...</form> 
<div class = "subdiv1" >...</div> 
<div class = "subdiv2" >...</div> 
    *lots of other <div> tags* 
</body> 
</html> 

내가 원하는을 스크래퍼를 추출하는 <div class = "want"...>*content*</div> d html 파일에 저장하십시오.

나는 이것에 대해 어떻게 생각해야하는지에 대한 매우 기본적인 생각을 가지고있다.

import urllib 
from urllib import request 
#import re 
#from html.parser import HTMLParser 

response = urllib.request.urlopen("http://website.com") 
html = response.read() 

#Some how extract that wanted data 

f = open('page.html', 'w') 
f.write(data) 
f.close() 

대단히 감사합니다.

+0

당신을 위해 모든 것을하는 웹 스크래핑 라이브러리를 사용하고 싶지는 않지만 ... [BeautifulSoup'] (http://www.crummy.com/software/BeautifulSoup/bs4/) 사용을 고려하고 싶을 수도 있습니다. doc /). HTML이 모두 현대적이고 유효하다면 stdlib에있는 것이 좋겠지 만, 버릇없는 실제 페이지를 다루기를 원한다면 BS는 당신의 삶을 훨씬 쉽게 만듭니다. (단순한 경우조차도 조금 더 간단합니다. 그러나 큰 문제는 아닙니다.) – abarnert

답변

2

표준 라이브러리는 다양한 Structured Markup Processing Tools과 함께 제공됩니다.이 라이브러리를 사용하여 HTML을 구문 분석 한 다음 div를 추출하여 div를 추출 할 수 있습니다.

거기에는 많은 선택 사항이 있습니다. 너는 무엇을 사용하니?

html.parser은 명백한 선택처럼 보이지만 사실은 ElementTree으로 시작합니다. 매우 훌륭하고 강력한 API이며 시작하기 위해 웹에 수많은 설명서와 샘플 코드가 있으며 매일 문제를 해결할 수있는 전문가가 많이 있습니다. etree가 HTML을 파싱 할 수 없다는 사실이 밝혀지면 다른 것을 사용해야 할 것입니다.하지만 먼저 시도하십시오.

<html> 
<head>...</head> 
<body> 
    *lots of other <div /> tags* 
<div class = "want" style="font-family:verdana;font-size:12px;letter-spacing:normal">spam spam spam 
<form class ="subform">...</form> 
<div class = "subdiv1" >...</div> 
<div class = "subdiv2" >...</div> 
    *lots of other <div /> tags* 
</div> 
</body> 
</html> 

이 같은 코드를 사용할 수 있습니다 (I는 '당신에게 몇 가지 사소한 수정과 예를 들어

는, 실제로 유효이고, 그래서 당신의 사업부에서 점점 가치가 텍스트 실제로이 그래서 HTML을 냈다

tree = ElementTree.fromstring(page) 
mydiv = tree.find('.//div[@class="want"]') 

는 이제 클래스 "want"div에 대한 참조를 가지고 : 당신이) 알고, 또는 XPath를 학습하고자하는 가정 해요. 이과의 직접 텍스트를 얻을 수 있습니다 :

print(mydiv.text) 

을하지만 전체 하위 트리를 추출 할 경우, 그조차입니다 쉽게 : 유효한 <html><body>에 그를 마무리하려면

data = ElementTree.tostring(mydiv) 

및/또는 <div> 자체를 제거하면 수동으로 해당 부분을 수행해야합니다. 문서에서는 간단한 트리 API를 사용하여 요소를 빌드하는 방법을 설명합니다. html에 넣을 및 body을 작성한 다음 bodydiv을 붙인 다음 에 붙이세요. 그게 전부입니다.

+0

XPath를 한번 사용해 보았지만 이전에는 XPath를 사용하는 방법에 대해 잘 모릅니다. 코드는 위의 HTML 예제와 완벽하게 (예상대로) 작동합니다. 그러나, 내가 긁어 내려고 시도했던 웹 사이트에서 이것을 시도했을 때,'xml.etree.ElementTree.ParseError : well-formed (유효하지 않은 토큰) 오류 '가있는 것 같았다. 이제는 웹 사이트의 HTML이 제대로 검증되지 않았기 때문에 추측하고 있습니다. 이것이 내가 수프쪽으로 밀었을 것으로 추측합니다 : P – Red

+0

사이트가 유효한지 확실하지 않은 경우 온라인 HTML 검사기를 사용하여 확인할 수 있습니다. HTML이 XHTML과 HTML5의 XML 렌더링을 제외한 HTML은 실제로 유효한 XML이 아니므로 XML 파싱 라이브러리와 같은 보증은 없다는 점에 유의하십시오. 'ElementTree'가 그것을 처리 할 것입니다. 실질적으로 말하자면, 대부분의 유효한 HTML 4.01 strict와 HTML5, 많은 4.01 과도기가 작동하지만 전부는 아니며 이전 버전은 작동 가능성이 훨씬 적습니다. – abarnert

+0

더 효과적인 대체 방법은 무엇입니까? ( – Red