匹配几个包含括号内文本的完整HTML段落

时间:2019-04-17 09:41:22

标签: python regex python-3.x web-scraping

我需要匹配完整的HTML段落,其中包含三重花括号之间的文本。

这是我输入的HTML:

<p><strong>{{{Lorem ipsum dolor sit amet.</strong></p>
<p>Ut enim ad minim veniam.</p>
<p>Duis aute irure dolor}}}</p>
<p><em>Excepteur sint occaecat cupidatat non proident.</em></p>
<p><strong><em>Sed {{{ut perspiciatis unde omnis iste natus error.</em></strong><em> sit voluptatem accusantium doloremque laudantium.</em></p>
<p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.}}}</p>
<p>Ut enim ad minima veniam, quis nostrum exercitationem.</p>

以下片段应匹配:

<p><strong>{{{Lorem ipsum dolor sit amet.</strong></p>
<p>Ut enim ad minim veniam.</p>
<p>Duis aute irure dolor}}}</p>

<p><strong><em>Sed {{{ut perspiciatis unde omnis iste natus error.</em></strong><em> sit voluptatem accusantium doloremque laudantium.</em></p>
<p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.}}}</p>

当前,我正在尝试使用以下正则表达式:

<p>.*?{{{.*?}}}<\/p>/gms

显然,它不能正常工作。

这是一个Regex101示例:https://regex101.com/r/9NSMy3/2

我知道使用regex解析HTML并不是最好的主意,因此也非常感谢其他解决方案。

1 个答案:

答案 0 :(得分:1)

您可以使用HTML解析器查找所有p元素,使用in运算符检查每个元素是否匹配,并将匹配项存储在列表中。在这里,我正在检查是否曾经使用begin标志查看过一组左括号(以跟踪正在进行的比赛)。

from bs4 import BeautifulSoup

inputhtml = '''
<p><strong>{{{Lorem ipsum dolor sit amet.</strong></p>
<p>Ut enim ad minim veniam.</p>
<p>Duis aute irure dolor}}}</p>
<p><em>Excepteur sint occaecat cupidatat non proident.</em></p>
<p><strong><em>Sed {{{ut perspiciatis unde omnis iste natus error.</em></strong><em> sit voluptatem accusantium doloremque laudantium.</em></p>
<p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.}}}</p>
<p>Ut enim ad minima veniam, quis nostrum exercitationem.</p>
'''

soup = BeautifulSoup(inputhtml,'html.parser')

fragments = []
begin = False
for p in soup.find_all('p'):
    if '{{{' in p.text:
        begin = True
        fragments.append(str(p))
    if '}}}' in p.text:
        begin = False
    if '}}}' in p.text and not '{{{' in p.text:
        fragments[-1] += str(p)
    elif begin and not '{{{' in p.text and not '}}}' in p.text:
        fragments[-1] += str(p)

print(fragments)

输出:

['<p><strong>{{{Lorem ipsum dolor sit amet.</strong></p><p>Ut enim ad minim veniam.</p><p>Duis aute irure dolor}}}</p>',
'<p><strong><em>Sed {{{ut perspiciatis unde omnis iste natus error.</em></strong><em> sit voluptatem accusantium doloremque laudantium.</em></p><p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.}}}</p>']