HTML解析器导入问题

时间:2016-12-15 17:21:12

标签: python web-crawler html-parser

所以我试图在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中运行

1 个答案:

答案 0 :(得分:0)

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

如果您使用的是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:无法转换'字节'隐含地反对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'。