gpt4 book ai didi

Python:SGMLParser 无法获取行号

转载 作者:行者123 更新时间:2023-11-28 18:41:12 25 4
gpt4 key购买 nike

我编写了继承 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']

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

最佳答案

您无法获取行号,因为 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']

关于Python:SGMLParser 无法获取行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25895852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com