MST

星途 面试题库

面试题:Python正则表达式处理复杂HTML标签及属性

对于一段复杂的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>,使用Python的正则表达式完成以下任务:1. 提取出所有a标签的href属性值;2. 提取出每个p标签内的文本及其中a标签的文本,同时要考虑到可能存在的其他嵌套标签;3. 阐述在这种复杂场景下使用正则表达式处理HTML标签可能存在的问题及替代方案。
16.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 提取所有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)
  1. 提取每个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)
  1. 使用正则表达式处理HTML标签存在的问题及替代方案
    • 问题
      • 嵌套标签处理困难:HTML标签是可以嵌套的,正则表达式很难准确处理复杂的嵌套结构。例如<div><p><a>链接</a></p></div>,正则表达式可能会匹配错误的标签对。
      • 标签属性处理不灵活:如果标签属性有多种形式,如<a href='https://example.com' target="_blank"><a href=\"https://example.com\" target='_blank'>,正则表达式需要编写复杂的规则来匹配所有可能的情况。
      • 容错性差:HTML代码可能存在格式不规范的情况,如标签未闭合等,正则表达式很难应对这些不规范的代码,容易导致匹配错误或遗漏。
    • 替代方案
      • 使用HTML解析库:如BeautifulSoup(Python)或Jsoup(Java)等。以BeautifulSoup为例:
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代码有更好的容错性。