gpt4 book ai didi

python - 在 Python 中有效地使用 HTMLParser

转载 作者:太空宇宙 更新时间:2023-11-03 11:57:19 24 4
gpt4 key购买 nike

回应Python regular expression我尝试使用 HTMLParser 实现 HTML 解析器:

import HTMLParser

class ExtractHeadings(HTMLParser.HTMLParser):

def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.text = None
self.headings = []

def is_relevant(self, tagname):
return tagname == 'h1' or tagname == 'h2'

def handle_starttag(self, tag, attrs):
if self.is_relevant(tag):
self.in_heading = True
self.text = ''

def handle_endtag(self, tag):
if self.is_relevant(tag):
self.headings += [self.text]
self.text = None

def handle_data(self, data):
if self.text != None:
self.text += data

def handle_charref(self, name):
if self.text != None:
if name[0] == 'x':
self.text += chr(int(name[1:], 16))
else:
self.text += chr(int(name))

def handle_entityref(self, name):
if self.text != None:
print 'TODO: entity %s' % name

def extract_headings(text):
parser = ExtractHeadings()
parser.feed(text)
return parser.headings

print extract_headings('abdk3<h1>The content we need</h1>aaaaabbb<h2>The content we need2</h2>')
print extract_headings('before<h1>&#72;e&#x6c;&#108;o</h1>after')

这样做我想知道是不是这个模块的 API 不好,或者我是否没有注意到一些重要的事情。我的问题是:

  • 为什么我的handle_charref 实现必须那么复杂?我本以为好的 API 会将代码点作为参数传递,而不是将 x6c72 作为字符串传递。
  • 为什么 handle_charref 的默认实现不使用适当的字符串调用 handle_data
  • 为什么没有我可以调用的 handle_entityref 实用程序实现?它可以命名为 handle_entityref_HTML4 并查找 HTML 4 中定义的实体,然后对它们调用 handle_data

如果提供了该 API,编写自定义 HTML 解析器就会容易得多。那么我的误解在哪里呢?

最佳答案

好吧,我倾向于同意 HTMLParser 不包含将 HTML 实体引用转换为正常 ASCII 和/或其他字符的代码是一个可怕的疏忽。我认为这可以通过 Python3 中完全不同的工作来解决。

但是,我们似乎可以编写一个相当简单的实体处理程序,例如:

import htmlentitydefs
def entity2char(x):
if x.startswith('&#x'):
# convert from hexadecimal
return chr(int(x[3:-1], 16))
elif x.startswith('&#'):
# convert from decimal
return chr(int(x[2:-1]))
elif x[1:-1] in htmlentitydefs.entitydefs:
return htmlentitydefs.entitydefs[x[1:-1]]
else:
return x

...尽管我们应该包装以进一步输入验证,并将整数转换包装在异常处理代码中。

但这应该可以处理大约 10 行代码中的最低限度。添加异常处理可能会使行数增加一倍。

关于python - 在 Python 中有效地使用 HTMLParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4182521/

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