寻找正则表达式来解析格式错误的 HTML 字符串

-1 python parsing

我正在寻找一个正则表达式模式,它将帮助我从这个使用错误标签解析的混乱 HTML 中获取信息:

<dt>Released
<dd>2019-02-13 <dt>First review
<dd>2019-02-13
<dt>Age
<dd>
914 days (2.5 years)
</dd></dt></dd></dt></dd></dt>
Run Code Online (Sandbox Code Playgroud)

对此:

2019-02-13
2019-02-13
914 days (2.5 years)
Run Code Online (Sandbox Code Playgroud)

现在看来,解决此问题的最简单方法是将原始类转换为字符串并使用正则表达式来提取正确的值。我想知道我应该使用什么正则表达式。

ggo*_*len 5

不要使用正则表达式来解析 HTML。使用 HTML 解析器:

>>> html = '''<dt>Released
... <dd>2019-02-13 <dt>First review
... <dd>2019-02-13
... <dt>Age
... <dd>
... 914 days (2.5 years)
... </dd></dt></dd></dt></dd></dt>'''
>>> from bs4 import BeautifulSoup
>>> [x.text for x in BeautifulSoup(html, "lxml").find_all("dd")]
['2019-02-13 ', '2019-02-13\n', '\n914 days (2.5 years)\n']
Run Code Online (Sandbox Code Playgroud)

x.text.strip()如果不需要空格,请使用)

如果不清楚这里发生了什么,HTML 解析器 (lxml) 实际上会为您修复 HTML(太棒了!!):

>>> BeautifulSoup(html, "lxml")
<html><body><dt>Released
</dt><dd>2019-02-13 </dd><dt>First review
</dt><dd>2019-02-13
</dd><dt>Age
</dt><dd>
914 days (2.5 years)
</dd></body></html>
Run Code Online (Sandbox Code Playgroud)

内置 html.parser 的情况并非如此:

>>> BeautifulSoup(html, "html.parser")
<dt>Released
<dd>2019-02-13 <dt>First review
<dd>2019-02-13
<dt>Age
<dd>
914 days (2.5 years)
</dd></dt></dd></dt></dd></dt>
>>> [x.text.strip() for x in BeautifulSoup(html, "html.parser").find_all("dd")]
['2019-02-13 First review\n2019-02-13\nAge\n\n914 days (2.5 years)', '2019-02-13
\nAge\n\n914 days (2.5 years)', '914 days (2.5 years)']
Run Code Online (Sandbox Code Playgroud)