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

Posted

技术标签:

【中文标题】使用 Python 和 lxml 从 HTML 中删除类属性【英文标题】:Remove class attribute from HTML using Python and lxml 【发布时间】:2012-04-19 16:56:22 【问题描述】:

问题

如何使用 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)

【问题讨论】:

谢谢。我想如果人们足够好来帮助我,我必须先付钱,让他们和其他人在未来更容易:) clean=re.sub('class=".*?"','', html) - 无法抗拒 【参考方案1】:

我目前无法对此进行测试,但这似乎是一般的想法

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

【讨论】:

谢谢丹。您的代码有效。我在这里根据您的建议添加了我的解决方案,作为我对其他人的问题的附录。【参考方案2】:

对于lxml elment,.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>

【讨论】:

【参考方案3】:

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>'

【讨论】:

以上是关于使用 Python 和 lxml 从 HTML 中删除类属性的主要内容,如果未能解决你的问题,请参考以下文章

Python操作XML和HTML,LXML类库的使用

使用由 Python 编写的 lxml 实现高性能 XML 解析

Python爬虫解析htm时lxml的HtmlElement对象获取和设置inner html方法

BeautifulSoup - lxml 和 html5lib 解析器抓取差异

lxml解析库的安装和使用

使用lxml的Python脚本,xpath返回空列表