HTML 解析器导入问题

HTML parser import issues

所以我尝试在 python 中使用 HTMLParser 和 urllib3 在 python 中制作网络爬虫。目前我有两个不同的导入问题,第一个是

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)

使用此代码 returns visual studio 错误框中的错误

name 'HTMLParser' is not defined

第二个选项完全相同,但使用 import 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)

哪个returns错误

No module named 'markupbase'

我对这些包裹失去了理智。有没有人知道修复或看到问题。 Ps。我是 运行 这个 Visual studio 2016 年 Python 3.5

我也在按照您正在学习的相同教程学习网络爬虫。我昨天 运行 该代码时也遇到了这些问题。经过几次 google 搜索后,我解决了这些问题。我是 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)

将字节转换为 sting 也适用于第 19 行

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

但是如果我使用这个 handle_data 将无法识别任何空格,例如“\n”。 所以代码在不删除任何'\n'的情况下工作正常。