HTML解析器handle_starttag()

时间:2016-05-01 17:24:35

标签: python html-parsing

我试图将所有绝对文件放入名为https的列表中。但是,当我运行我的代码,并尝试返回https时,它返回一个空列表。有人能帮助我吗?

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')

返回:

网页上的所有绝对链接

[]

我希望能够运行代码,这样当我输入任何url时,它会返回在该网页上找到的绝对链接。我真的不想使用BeautifulSoup ..任何人都可以帮助我

EDITED 我在我的代码中调用了handle_starttag,现在我收到了这个错误:
如果attr [0] ==' href': TypeError:' HTTPResponse' object不支持索引

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

HTMLParser类并非设计为开箱即用。我们的想法是,您创建自己的类,该类继承自HTMLParser并覆盖您要使用的方法。在实践中,这意味着添加您的' handle_starttag'函数类,如下:

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存在问题:现在它在一个类中,名称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)