所以我试图在python中使用HTMLParser和urllib3在python中创建一个web爬虫。目前我有两个不同的导入问题,第一个是
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中运行
答案 0 :(得分:0)
我也遵循您正在学习网络抓取的相同教程。我运行该代码时昨天也遇到了这些问题。经过一些谷歌搜索,我解决了这些问题。我是python和web爬行的新手,所以如果我说错了,请纠正我。
如果您使用的是python 3.5,则应导入HTMLParser from html.parser
和urllib.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:无法转换'字节'隐含地反对str
这是因为HTMLParser.feed()
只接受字符串而urllib.request.urlopen().read()
生成原始数据作为字节。所以我们将把这个原始数据解码为utf8。在第19行,我们在.decode('utf8')
之后添加read()
。
最终的代码看起来像
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)
将字节转换为sting也适用于第19行
lParser.feed(str(urllib.request.urlopen(thisurl).read()))
但如果我使用此handle_data,则无法识别任何空格,例如' \ n'。 所以代码工作正常而不删除任何' \ n'。