面试题答案
一键面试- 提取所有a标签的href属性值:
import re
html = "<div class='main'><p id='para1'>段落文本 <a href='https://example1.com' target='_blank'>链接1</a></p><p id='para2'>另一段文本 <a href='https://example2.com' target='_self'>链接2</a></p></div>"
href_values = re.findall(r'<a\s+href="([^"]+)"', html)
print(href_values)
- 提取每个p标签内的文本及其中a标签的文本:
import re
html = "<div class='main'><p id='para1'>段落文本 <a href='https://example1.com' target='_blank'>链接1</a></p><p id='para2'>另一段文本 <a href='https://example2.com' target='_self'>链接2</a></p></div>"
p_pattern = r'<p.*?>(.*?)</p>'
p_contents = re.findall(p_pattern, html, re.DOTALL)
result = []
for p_content in p_contents:
a_pattern = r'<a.*?>(.*?)</a>'
a_texts = re.findall(a_pattern, p_content, re.DOTALL)
other_text = re.sub(r'<.*?>', '', p_content).strip()
sub_result = {
'other_text': other_text,
'a_texts': a_texts
}
result.append(sub_result)
print(result)
- 使用正则表达式处理HTML标签存在的问题及替代方案:
- 问题:
- 嵌套标签处理困难:HTML标签是可以嵌套的,正则表达式很难准确处理复杂的嵌套结构。例如
<div><p><a>链接</a></p></div>
,正则表达式可能会匹配错误的标签对。 - 标签属性处理不灵活:如果标签属性有多种形式,如
<a href='https://example.com' target="_blank">
和<a href=\"https://example.com\" target='_blank'>
,正则表达式需要编写复杂的规则来匹配所有可能的情况。 - 容错性差:HTML代码可能存在格式不规范的情况,如标签未闭合等,正则表达式很难应对这些不规范的代码,容易导致匹配错误或遗漏。
- 嵌套标签处理困难:HTML标签是可以嵌套的,正则表达式很难准确处理复杂的嵌套结构。例如
- 替代方案:
- 使用HTML解析库:如
BeautifulSoup
(Python)或Jsoup
(Java)等。以BeautifulSoup
为例:
- 使用HTML解析库:如
- 问题:
from bs4 import BeautifulSoup
html = "<div class='main'><p id='para1'>段落文本 <a href='https://example1.com' target='_blank'>链接1</a></p><p id='para2'>另一段文本 <a href='https://example2.com' target='_self'>链接2</a></p></div>"
soup = BeautifulSoup(html, 'html.parser')
href_values = [a['href'] for a in soup.find_all('a')]
p_texts = []
for p in soup.find_all('p'):
a_texts = [a.get_text() for a in p.find_all('a')]
other_text = p.get_text()
for a_text in a_texts:
other_text = other_text.replace(a_text, '').strip()
sub_result = {
'other_text': other_text,
'a_texts': a_texts
}
p_texts.append(sub_result)
print(href_values)
print(p_texts)
BeautifulSoup
可以将HTML解析为树形结构,方便准确地提取各种元素和属性,并且对不规范的HTML代码有更好的容错性。