Python:SGMLParser无法获取行号

时间:2014-09-17 16:33:38

标签: python parsing sgml

我编写了继承SGMLParser的简单类。这个课程的主要思想是从html页面收集所有链接,并打印可以找到此链接的行号。

该课程如下:

class HtmlParser(SGMLParser):
    def reset(self):
        SGMLParser.reset(self)
        self.links = []

    def start_a(self, attr):
        href = [v for k, v in attr if k == "href"]
        self.links.append(href[0])
        print(self.getpos())

问题是getpos()在每个链接上都返回(1,0)。因此,如果运行以下代码:

parser = HtmlParser()
parser.feed('''
<!DOCTYPE html>
    <html>
        <head lang="en">
            <meta charset="UTF-8">
            <title></title>
        </head>
        <body>
            <a href="www.foo-bar.com"></a>
            <a href="http://foo.bar.com"></a>
            <a href="www.google.com"></a>
        </body>
    </html>''')
parser.close()
print(parser.links)

输出将是:

(1, 0)
(1, 0)
(1, 0)
['www.foo-bar.com', 'http://foo.bar.com', 'www.google.com']

问题:为什么我无法获得链接的实际行号?

1 个答案:

答案 0 :(得分:1)

您无法获取行号,因为sgmllib is broken

作为替代方案,您可以以类似的方式使用HTMLParser

from HTMLParser import HTMLParser


class MyHTMLParser(HTMLParser):
    def reset(self):
        HTMLParser.reset(self)
        self.links = []

    def handle_starttag(self, tag, attr):
        if tag == 'a':
            href = [v for k, v in attr if k == "href"]
            self.links.append(href[0])
            print(self.getpos())

parser = MyHTMLParser()
parser.feed('''
<!DOCTYPE html>
    <html>
        <head lang="en">
            <meta charset="UTF-8">
            <title></title>
        </head>
        <body>
            <a href="www.foo-bar.com"></a>
            <a href="http://foo.bar.com"></a>
            <a href="www.google.com"></a>
        </body>
    </html>''')
parser.close()
print(parser.links)

预期输出的内容:

(9, 12)
(10, 12)
(11, 12)
['www.foo-bar.com', 'http://foo.bar.com', 'www.google.com']