2016-12-15 75 views
1

所以我想在Python中使用HTMLParser和urllib3在python中制作一个web爬虫。目前我有两个不同的进口问题,第一个是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) 

,并与此代码是在Visual Studio错误框

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' 

我对包装失去了主意。有谁知道修补程序或看到问题。 Ps。我在Visual Studio 2016中运行了这个工具,并且在Python 3.5中运行了这个工具。

+1

我无法在第二个示例中重现该问题。请显示完整的追踪。还要修复您的缩进。 –

回答

0

我也在学习网络抓取的相同教程。当我运行该代码时,我也遇到了这些问题。经过几次谷歌搜索,我解决了这些问题。我是python和网络爬虫的新手,所以如果我说错了什么,请纠正我。

如果您使用python 3.5,您应该导入HTMLParser from html.parserurllib.request。 在第7行,您必须继承HTMLParser而不是HTMLParser.HTMLParser。 此时你的代码应该是这样的

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) 

现在,如果你运行这段代码,你将这个错误

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

这是因为HTMLParser.feed()只需要串并urllib.request.urlopen().read()生成原始数据的字节。所以我们将把这个原始数据解码为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