【问题标题】:Can I remove tags whose "style" attributes have specific value, then all attributes of tags in BeautifulSoup?我可以删除“样式”属性具有特定值的标签,然后是 BeautifulSoup 中标签的所有属性吗?
【发布时间】:2019-03-12 17:02:04
【问题描述】:

原来的 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>

那么第二步就是去掉所有的style属性:

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

也许上面的例子有点奇怪。但问题是:虽然很容易在 BeautifulSoup 对象中找到一个标签(或多个标签),但我们能找到一种简单的方法来操作 BeautifulSoup 对象本身吗?如果我知道标签的位置,我可以轻松地将它从 BeautifulSoup 对象中删除。比如我想去掉第二个&lt;li&gt;标签,我可以用soup.ul.li指向第一个&lt;li&gt;标签,然后用.next_sibling移动到第二个,再用.decompose()去从 BeautifulSoup 对象中删除它。但是如果我不知道要删除的标签的位置,只知道这些标签应该满足的条件,似乎没有办法找出这些标签的确切位置,然后对 BeautifulSoup 对象进行操作。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    您可以使用re 包来匹配style 属性中的text-align: center。 然后,您只需检查其存在即可删除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>
    

    【讨论】:

    • 谢谢!您的回答帮助我意识到从find_all() 获得的列表元素实际上是原始 BeautifulSoup 对象的节点,而不是新的 BeautifulSoup 项目。这就是重点。
    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 2011-04-16
    • 2015-03-11
    • 2013-10-21
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多