我可以删除“样式”属性具有特定值的标签,然后删除BeautifulSoup中标签的所有属性吗?

时间:2019-03-12 17:02:05

标签: python beautifulsoup

原始的BeautifulSoup对象如下所示:

<p style="padding-left: 140pt;text-indent: 0pt;line-height: 13pt;text-align: center;">blahblah</p>
<ul>
    <li style="padding-left: 11pt;text-indent: 0pt;line-height: 14pt;text-align: left;">
        <p style="display: inline;">blahblah</p>
    </li>
    <li style="padding-left: 11pt;text-indent: 0pt;line-height: 14pt;text-align: left;">
         <p style="text-indent: 0pt;text-align: center;">blahblah</p>
    </li>
</ul>

我要做的第一步是删除所有样式属性包括居中文本对齐方式的标签:

<ul>
    <li style="padding-left: 11pt;text-indent: 0pt;line-height: 14pt;text-align: left;">
        <p style="display: inline;">blahblah</p>
    </li>
    <li style="padding-left: 11pt;text-indent: 0pt;line-height: 14pt;text-align: left;">
    </li>
</ul>

然后第二步是删除所有样式属性:

<ul>
    <li>
        <p>blahblah</p>
    </li>
    <li>
    </li>
</ul>

也许上面的例子有点奇怪。但是问题是:尽管可以很容易地在BeautifulSoup对象中找到一个或多个标签,但我们能找到一种简单的方法来操作BeautifulSoup对象本身吗?如果知道标签的位置,则可以轻松地将其从BeautifulSoup对象中删除。例如,如果要删除第二个<li>标记,可以使用soup.ul.li指向第一个<li>标记,然后使用.next_sibling移至第二个标记,然后使用.decompose()将其从BeautifulSoup对象中删除。但是,如果我不知道要删除的标签的位置,只是知道这些标签应符合的条件,似乎就无法找出这些标签的确切位置,然后对BeautifulSoup对象进行操作。

1 个答案:

答案 0 :(得分:0)

您可以使用re包来匹配text-align: center属性中的style。 然后,您只需检查style属性的存在即可。

代码:

from bs4 import BeautifulSoup as soup
import requests
import re

html = """<p style="padding-left: 140pt;text-indent: 0pt;line-height: 13pt;text-align: center;">blahblah</p>
<ul>
    <li style="padding-left: 11pt;text-indent: 0pt;line-height: 14pt;text-align: left;">
        <p style="display: inline;">blahblah</p>
    </li>
    <li style="padding-left: 11pt;text-indent: 0pt;line-height: 14pt;text-align: left;">
         <p style="text-indent: 0pt;text-align: center;">blahblah</p>
    </li>
</ul>"""

page = soup(html, 'html.parser')

style_center = page.find_all(style=re.compile('text-align: center'))
for style in style_center:
    style.decompose()

for tag in page.find_all():
    if 'style' in tag.attrs:
        del tag.attrs['style']

print(page)

输出:

<ul>
<li>
<p>blahblah</p>
</li>
<li>

</li>
</ul>