我编写了继承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']
问题:为什么我无法获得链接的实际行号?
答案 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']