需要 Python 中正则表达式模式的帮助 – 解析复杂的 HTML 结构

Need Assistance with a regex pattern in Python – Parsing complex HTML structures

提问人:prabu naresh 提问时间:9/2/2023 更新时间:9/2/2023 访问量:50

问:

我正在尝试使用 Python 的 re 模块解析复杂的 HTML 结构,但我的正则表达式模式遇到了障碍。这是我想做的:

我有包含嵌套元素的 HTML 文本,我想提取最内层标签的内容。但是,我似乎无法正确处理我的正则表达式模式。这是我正在使用的代码:

import re

html_text = """
<div>
    <div>
        <div>
            Innermost Content 1
        </div>
    </div>
    <div>
        Innermost Content 2
    </div>
</div>
"""

pattern = r'<div>(.*?)<\/div>'
result = re.findall(pattern, html_text, re.DOTALL)

print(result)

我希望这段代码返回最里面元素的内容,如下所示:

['Innermost Content 1', 'Innermost Content 2']

但它没有按预期工作。我的正则表达式模式做错了什么,我该如何修复它以达到预期的结果?任何帮助将不胜感激!

python 正则表达式 解析 web-scraping html-parsing

评论

2赞 The_spider 9/2/2023
从HTML开始变得更加复杂(不必要的空格、属性、注释、javascript代码......)的那一刻起,这可能变得非常棘手。我建议使用适当的 HTML 解析库。
0赞 OysterShucker 9/2/2023
为什么不直接使用内置的 HTMLParser?

答:

0赞 sahar mirjavadi 9/2/2023 #1

您可以使用以下命令:

[re.sub(r'<div>|<\/div>|\s+', '', item) for item in result]

您也可以使用适当的 HTML 解析库,例如 BeautifulSoup:

# Parse the HTML with BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')

# Find all <div> elements and extract their text
div_elements = soup.find_all('div')
for div in div_elements:
    print(div.get_text())
2赞 smoks 9/2/2023 #2

尝试使用更改的模式和额外的行来尝试修改此代码以删除\n

import re

html_text = """
<div>
    <div>
        <div>
            Innermost Content 1
        </div>
    </div>
    <div>
        Innermost Content 2
    </div>
</div>
"""

pattern = r'<div>([^<]*?)<\/div>'
result = re.findall(pattern, html_text, re.DOTALL)

result = [content.strip() for content in result if content.strip()]

print(result)
0赞 LetzerWille 9/2/2023 #3

可以使用 re.split()

print([st.strip() for st in re.split(r'<div>\n?|<.div>\n?|\n', html_text) if not st.isspace() and st])

['Innermost Content 1', 'Innermost Content 2']