HTML 解析器 handle_starttag()

HTML Parser handle_starttag()

我正在尝试将所有绝对文件放入一个名为 https 的列表中。但是,当我 运行 我的代码并尝试 return https 时,它 return 是一个空列表。有人可以帮我吗?

def getWebInfo(url):
    infile=urlopen(url)
    content=infile.read().decode()
    infile.close()
    https=[]

    def handle_starttag(tag, attrs):
        if tag.lower() == 'a':
             for attr in attrs:
                 if attr[0]=='href':
                     absolute=urljoin(url, attr[1])
                     if absolute[:7]=='http://':
                         https.append(absolute)
    parser=HTMLParser()
    parser.feed(content)

    print('ALL ABSOLUTE LINKS ON THE WEB PAGE')
    print('--------------------------------------')
    return https

getWebInfo('https://python.readthedocs.io/en/v2.7.2/library/htmlparser.html')

return秒:

网页上的所有绝对链接

[]

我希望能够 运行 代码,这样当我输入任何 url 时,它 return 就是在该网页上找到的绝对链接。我真的不想使用 BeautifulSoup.. 谁能帮我

已编辑 我在我的代码中调用了 handle_starttag,现在我得到了这个错误:
如果 attr[0] == 'href': 类型错误:'HTTPResponse' 对象不支持索引

这里的问题是您永远不会修改 https 列表。您定义了 handle_starttag 函数——它附加到列表中——但是从不调用它。

HTMLParser class 并非设计为开箱即用。这个想法是您创建自己的 class 从 HTMLParser 继承并覆盖您要使用的方法。实际上,这意味着将 'handle_starttag' 函数添加到 class,如下所示:

class MyParser(HTMLParser):   # <- new class is a subclass of HTMLParser

    def handle_starttag(self, tag, attrs):  # <- methods need a self argument
        if tag.lower() == 'a':
             for attr in attrs:
                 if attr[0]=='href':
                     absolute=urljoin(url, attr[1])
                     if absolute[:7]=='http://':
                         https.append(absolute)

但是 handle_starttag 有一个问题:现在它在 class 中,名称 httpsurl 没有定义。您可以在创建解析器后通过将它们设为解析器的属性来解决此问题,如下所示:

parser = MyParser()
parser.https = https
parser.url = url

并在 handle_starttags 方法中为它们添加前缀 self.,以便 Python 解释器在您的解析器中查找这些属性。所以你的代码应该看起来像这样:

class MyParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        if tag.lower() == 'a':
             for attr in attrs:
                 if attr[0]=='href':
                     absolute=urljoin(self.url, attr[1])
                     if absolute[:7]=='http://':
                         self.https.append(absolute)


def getWebInfo(url):
    infile=urlopen(url)
    content=infile.read().decode()
    infile.close()
    https=[]

    parser=MyParser()
    parser.https = https
    parser.url = url
    parser.feed(content)

    print('ALL ABSOLUTE LINKS ON THE WEB PAGE')
    print('--------------------------------------')
    return https

links = getWebInfo('https://python.readthedocs.io/en/v2.7.2/library/htmlparser.html')


for link in links:
    print(link)