剥离标签的正确方法,除了python中的一些标签

时间:2014-12-20 16:15:15

标签: python html

例如,我有HTML代码,其中包含这样的代码

<a href="some" class="some" onclick="return false;">anchor</a>
<table id="some">
    <tr>
        <td class="some">
        </td>
    </tr>
</table>
<p class="" style="">content</p>

我想要删除所有标签属性并仅保存一些标签(例如,删除table,tr,tr,th标签),所以,我想得到这样的东西。

<a href="some">anchor</a>
<table>
    <tr>
        <td>

        </td>
    </tr>
</table>
<p>content</p>

我使用for循环,但我的代码检索每个标记并清除它。我认为我的方式很慢。

你能建议我什么?感谢。

更新#1

在我的解决方案中,我使用此代码删除标签(从django窃取)

def remove_tags(html, tags):
    """Returns the given HTML with given tags removed."""
    tags = [re.escape(tag) for tag in tags.split()]
    tags_re = '(%s)' % '|'.join(tags)
    starttag_re = re.compile(r'<%s(/?>|(\s+[^>]*>))' % tags_re, re.U)
    endtag_re = re.compile('</%s>' % tags_re)
    html = starttag_re.sub('', html)
    html = endtag_re.sub('', html)
    return html

此代码用于清理HTML属性

# But this code doesnt remove empty tags (without content ant etc.) like this `<div><img></div>`
import lxml.html.clean

html = 'Some html code'

safe_attrs = lxml.html.clean.defs.safe_attrs
cleaner = lxml.html.clean.Cleaner(safe_attrs_only=True, safe_attrs=frozenset())
html = cleaner.clean_html(html)

2 个答案:

答案 0 :(得分:3)

使用beautifulsoup

html = """
<a href="some" class="some" onclick="return false;">anchor</a>
<table id="some">
    <tr>
        <td class="some">
        </td>
    </tr>
</table>
<p class="" style="">content</p>
"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(html)

del soup.table.tr.td.attrs 
del soup.table.attrs 
print(soup.prettify())

<html>
 <body>
  <a class="some" href="some" onclick="return false;">
   anchor
  </a>
  <table>
   <tr>
    <td>
    </td>
   </tr>
  </table>
  <p class="" style="">
   content
  </p>
 </body>
</html>

清除标签:

soup = BeautifulSoup(html)

soup.table.clear()
print(soup.prettify())

<html>
 <body>
  <a class="some" href="some" onclick="return false;">
   anchor
  </a>
  <table id="some">
  </table>
  <p class="" style="">
   content
  </p>
 </body>
</html>

删除特定属性:

soup = BeautifulSoup(html)

td_tag =  soup.table.td
del td_tag['class']
print(soup.prettify())

<html>
 <body>
  <a class="some" href="some" onclick="return false;">
   anchor
  </a>
  <table id="some">
   <tr>
    <td>
    </td>
   </tr>
  </table>
  <p class="" style="">
   content
  </p>
 </body>
</html>

答案 1 :(得分:1)

您正在寻找的是解析。

BeautifulSoup是用于解析html的最受欢迎/最常用的库之一。 你可以用它来删除标签,它很好documented

如果你(由于某种原因)不能使用BeautifulSoup,那么请查看python re模块。