面试题答案
一键面试import re
def parse_html(html_str):
# 匹配所有标签
tag_pattern = re.compile(r'<\s*([^>\s/]*)(\s+[^>]*?)?\s*(\/?)>')
tags_info = []
for match in tag_pattern.finditer(html_str):
tag_name = match.group(1)
attrs_str = match.group(2)
is_self_closing = bool(match.group(3))
attrs = {}
if attrs_str:
attr_pattern = re.compile(r'\s*(\w+)\s*=\s*"([^"]*)"')
for attr_match in attr_pattern.finditer(attrs_str):
attrs[attr_match.group(1)] = attr_match.group(2)
tag_info = {
"tag_name": tag_name,
"attributes": attrs,
"is_self_closing": is_self_closing
}
tags_info.append(tag_info)
return tags_info
你可以使用以下方式调用这个函数:
html_doc = '<div class="test">content <input type="text" value="123" /> more content</div>'
result = parse_html(html_doc)
print(result)
上述代码解释:
- 使用
re.compile
定义一个正则表达式,用于匹配HTML标签。 - 遍历正则表达式的匹配结果,提取标签名、属性字符串和是否自闭合的信息。
- 如果存在属性字符串,再使用另一个正则表达式提取属性名和属性值,并存储到字典中。
- 将每个标签的信息存储到一个列表中,列表元素是字典,包含标签名、属性字典和是否自闭合的信息。
- 最后返回这个列表。
测试部分给出了一个简单的HTML字符串,调用parse_html
函数并打印结果。