使用Python和lxml从HTML中删除class属性

时间:2012-04-05 23:12:12

标签: python html lxml

问题

如何使用python和lxml从html中删除类属性?

实施例

我有:

<p class="DumbClass">Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>

我想:

<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>

到目前为止我尝试了什么

我已经检查了lxml.html.clean.Cleaner但是,它没有一个方法来去除类属性。您可以设置safe_attrs_only=True但是,这不会删除类属性。

重要的搜索结果没有任何可行性。我认为class在html和python中使用的事实进一步混淆了搜索结果。许多结果似乎也严格遵守xml。

我对其他提供人性化界面的python模块持开放态度。

非常感谢。


解决方案

感谢@Dan Roberts在下面的回答,我提出了以下解决方案。为将来到达这里的人们提供解决同样问题的方法。

import lxml.html

# Our html string we want to remove the class attribute from
html_string = '<p class="DumbClass">Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>'

# Parse the html
html = lxml.html.fromstring(html_string)

# Print out our "Before"
print lxml.html.tostring(html)

# .xpath below gives us a list of all elements that have a class attribute
# xpath syntax explained:
# // = select all tags that match our expression regardless of location in doc
# * = match any tag
# [@class] = match all class attributes
for tag in html.xpath('//*[@class]'):
    # For each element with a class attribute, remove that class attribute
    tag.attrib.pop('class')

# Print out our "After"
print lxml.html.tostring(html)

3 个答案:

答案 0 :(得分:15)

我现在无法测试这个,但这似乎是一般的想法

for tag in node.xpath('//*[@class]'):
    tag.attrib.pop('class')

答案 1 :(得分:1)

lxml.html.clean.Cleaner可以工作,但是需要适当的配置。

import lxml.html
from lxml.html import clean

html_string = '<p id="test" class="DumbClass">Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>'
tree = html.fromstring(html_string)

cleaner = html.clean.Cleaner()
cleaner.safe_attrs_only = True
cleaner.safe_attrs=frozenset(['id'])
cleaned = cleaner.clean_html(tree)
print(html.tostring(cleaned))

结果:

b'<p id="test">Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>'

答案 2 :(得分:0)

对于lxml元素,.attrib对象包含属性的字典,您只需del就可以了。

以下是一个简单示例,说明如何在html中替换属性名称。

鉴于html

<div><img src="http://www.example.com/logo.png"></div>

代码:

from lxml.html import fromstring
from lxml.html import _transform_result

html = "<div><img src=\"http://www.example.com/logo.png\"></div>"
doc = fromstring(html)
for el in doc.iter('img'):
    if "src" in el.attrib:
        el.set('data-src', el.get('src'))
        del el.attrib["src"]
print _transform_result(type(html), doc)

结果:

<div><img data-src="http://www.example.com/logo.png"></div>