在大型HTML文件python中使用漂亮的汤正则表达式

时间:2019-03-14 14:10:16

标签: python html regex

我在任何地方都找不到这个特定问题的答案,而且我自己也找不到答案。

我有一个很大的HTML文件,它是电子邮件的模板。我已将其阅读为文本文件,并将值保存在html_string变量中。在包含诸如

之类的语句的几行中,
<span style="color: #ff0000;"> {column_1}</span>

<span style="color: #ff0000;">{column_2}</span>

其中{column_ *}部分将被其他值(例如名称)替换。另一个问题建议使用诸如

    soup = BeautifulSoup(html_string, features="html5lib")

    target = soup.find_all(text=re.compile('^{column_$'))

    print("Target:")
    print(target)

    for v in target:
        # do something (this never gets accessed due to empty list)

返回

   >>Target:
   >> []

我希望它会返回{column_ *}或其他可用于插入自己的字符串的位置的列表。

对于re.compile(x)部分,我尝试了几种不同的结构,但没有任何效果。

任何帮助将不胜感激!

编辑------ 出于某种原因,即使我导入了bs4,也只有findAll函数会执行我需要的操作-通常建议不要使用此函数,因为bs4中的find_all将“执行相同的操作”¬(..)¬

    soup = BeautifulSoup(html_string, features="html5lib")
    target = soup.findAll(text=re.compile('{column_.}'))

    for v in target:
        v.replace_with(dictionary[str(v)])

    body = str(soup)

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式查找模板并将文本替换为所需的值:

import re
vals = {'column_1':'Name', 'column_2':'Age'}
result = re.sub('\{.*?\}', lambda x:vals[x.group()[1:-1]], content)
print(result)

输出:

<span style="color: #ff0000;"> Name</span>

<span style="color: #ff0000;">Age</span>

答案 1 :(得分:0)

您也可以使用字典吗?

html  = '''
<span style="color: #ff0000;">column_1</span>
<span style="color: #ff0000;">column_2</span>
'''
soup = bs(html, 'lxml')
dict = {'column_1':'Name', 'column_2':'Age'}

for item in soup.select('[style="color: #ff0000;"]'):
    try:
        item.string = dict[item.text]
    except:
        continue
print(soup)