gpt4 book ai didi

python - HTMLParser 误解了 href 中的实体。是不是错误?我应该报告吗?

转载 作者:行者123 更新时间:2023-11-28 22:47:36 24 4
gpt4 key购买 nike

我不想知道如何解决这个问题,因为我已经自己解决了。我只是问它是否真的是一个错误以及我是否应该报告它以及如何报告它。您可以在下面找到代码和输出:

from html.parser import HTMLParser

class MyParser(HTMLParser):
def handle_starttag(self, tag, attrs):
for at in attrs:
if at[0] == 'href':
print(at[1])
return super().handle_starttag(tag, attrs)

def handle_data(self, data):
return super().handle_data(data)

def handle_endtag(self, tag):
return super().handle_endtag(tag)



s = '<a href="/home?ID=123&gt3=7">nomeLink</a>'

p = MyParser()
p.feed(s)

输出如下:

"/home?ID=123>3=7"

最佳答案

不,这不是错误。您正在向解析器提供无效的 HTML,在 HTML 属性的 URL 中包含 & 的正确方法是将其转义为 &:

>>> s = '<a href="/home?ID=123&amp;gt3=7">nomeLink</a>'
>>> p = MyParser()
>>> p.feed(s)
/home?ID=123&gt3=7

解析器尽其所能(按照 HTML 标准的要求)并尽其所能为您“修复”数据。在这种情况下,它试图修复另一个常见的损​​坏 HTML 错误:将 > 拼写为 >>(忘记 ; 分号)。

与其在(相当低级的)html.parser 库之上自己构建,我建议您使用 BeautifulSoup反而。 BeautifulSoup 支持多种解析器,其中一些可以比其他解析器更好地处理损坏的 HTML。

例如,html5lib 解析器可以比 html.parser 更好地处理属性中未转义的 & 符号:

>>> from bs4 import BeautifulSoup
>>> s = '<a href="/home?ID=123&gt3=7">nomeLink</a>'
>>> BeautifulSoup(s, 'html.parser').find('a')['href']
'/home?ID=123>3=7'
>>> BeautifulSoup(s, 'html5lib').find('a')['href']
'/home?ID=123&gt3=7'

为了完整起见,第三个受支持的解析器 lxml 也像处理转义一样处理未转义的 & 符号:

>>> BeautifulSoup(s, 'lxml').find('a')['href']
'/home?ID=123&gt3=7'

您可以直接使用 lxmlhtml5lib,但是您会放弃 BeautifulSoup 提供的高级 API。

关于python - HTMLParser 误解了 href 中的实体。是不是错误?我应该报告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26072209/

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