2016-12-15 12 views
1

그래서 파이썬에서 HTMLParser 및 urllib3을 사용하여 파이썬에서 웹 크롤러를 만들려고합니다. 현재 내가 두 개의 서로 다른 수입 문제가 첫 번째 HTML 파서 가져 오기 문제

import html.parser 
import urllib 

urlText = [] 

#Define HTML Parser 
class parseText(HTMLParser.HTMLParser): 

def handle_data(self, data): 
    if data != '\n': 
     urlText.append(data) 


#Create instance of HTML parser 
lParser = parseText() 

thisurl = "http://www-rohan.sdsu.edu/~gawron/index.html" 
#Feed HTML file into parser 
lParser.feed(urllib.urlopen(thisurl).read()) 
lParser.close() 
for item in urlText: 
    print (item) 

되는이 코드는 비주얼 스튜디오 오류 상자

name 'HTMLParser' is not defined 

에서 오류를 반환하고 두 번째 옵션은 동일한하지만와 수입 HTMLParser이다가 대신 html.parser의 오류를 반환

import HTMLParser 
import urllib 

urlText = [] 

#Define HTML Parser 
class parseText(HTMLParser.HTMLParser): 

def handle_data(self, data): 
    if data != '\n': 
     urlText.append(data) 


#Create instance of HTML parser 
lParser = parseText() 

thisurl = "http://www-rohan.sdsu.edu/~gawron/index.html" 
#Feed HTML file into parser 
lParser.feed(urllib.urlopen(thisurl).read()) 
lParser.close() 
for item in urlText: 
    print (item) 

No module named 'markupbase' 

패키지가 마음에 들지 않습니다. 누구나 수정 사항을 알고 있거나 문제가 있는지 확인하십시오. 시. Visual Studio 2016에서 실행 중이며 Python 3.5에 있습니다.

+1

두 번째 샘플에서 문제를 재현 할 수 없습니다. 전체 추적을 보여주십시오. 또한 들여 쓰기를 수정하십시오. –

답변

0

웹 크롤링을 배우기 위해 다음과 같은 튜토리얼을 사용하고 있습니다. 나는 어제 그 코드를 실행할 때 그 문제를 가지고있다. 몇 가지 Google 검색 후 나는 그것들을 해결했다. 저는 파이썬과 웹 크롤링에 익숙하지 않으므로 잘못된 것을 말하면 수정 해주십시오.

파이썬 3.5를 사용하는 경우 HTMLParser from html.parserurllib.request을 가져와야합니다. 7 번째 줄에서는 HTMLParser.HTMLParser 대신 HTMLParser 만 상속해야합니다. 당신은 당신이 HTMLParser.feed()은 문자열을 받아 urllib.request.urlopen().read() 바이트로 원시 데이터를 생성하기 때문에의이 오류

TypeError: Can't convert 'bytes' object to str implicitly

에게 것이 코드를 실행하면 는이 시점에서 코드 지금이

from html.parser import HTMLParser 
import urllib.request 

urlText = [] 

#Define HTML Parser 
class parseText(HTMLParser): 

    def handle_data(self, data): 
     if data != '\n': 
      urlText.append(data) 


#Create instance of HTML parser 
lParser = parseText() 

thisurl = "http://www-rohan.sdsu.edu/~gawron/index.html" 
#Feed HTML file into parsers 
lParser.feed(urllib.request.urlopen(thisurl).read()) 
lParser.close() 
for item in urlText: 
    print (item) 

과 같이해야한다. 그래서 우리는이 원시 데이터를 utf8로 디코딩하려고합니다. 19 번째 줄에 read() 뒤에 .decode('utf8')을 추가합니다. 마지막 코드는

from html.parser import HTMLParser 
import urllib.request 

urlText = [] 

#Define HTML Parser 
class parseText(HTMLParser): 

    def handle_data(self, data): 
     if data != '\n': 
      urlText.append(data) 


#Create instance of HTML parser 
lParser = parseText() 

thisurl = "http://www-rohan.sdsu.edu/~gawron/index.html" 
#Feed HTML file into parsers 
lParser.feed(urllib.request.urlopen(thisurl).read().decode('utf8')) 
lParser.close() 
for item in urlText: 
    print (item) 

이 고통 바이트 변환과 같이됩니다 또한 라인 (19)

lParser.feed(str(urllib.request.urlopen(thisurl).read())) 

에서이 작동하지만 난이 handle_data를 사용하는 경우와 같은 '\ n을로 공백을 인식하지 않습니다 '. 그래서 '\ n'을 제거하지 않고도 코드가 제대로 작동합니다.

+0

정말 고마워요. 이것은 톤을 도왔으며 완벽한 해답이었습니다. –

+0

여전히이 자습서를 따르고 있습니까? – tontus