【问题标题】:Python: SGMLParser can't get line numberPython:SGMLParser 无法获取行号
【发布时间】:2014-09-17 16:33:38
【问题描述】:

我写了一个简单的类来继承 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']

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

【问题讨论】:

    标签: python parsing sgml


    【解决方案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']
    

    【讨论】:

      猜你喜欢
      • 2013-11-08
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      相关资源
      最近更新 更多