16

Вопрос по html, python – Удалить атрибут класса из HTML, используя Python и lxml

Question

Как удалить атрибуты класса из html, используя python и lxml?

Example

Я имею:

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

Я хочу:

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

What I've tried so far

Я проверилlxml.html.clean.Cleaner однако у него нет метода для удаления атрибутов класса. Вы можете установитьsafe_attrs_only=True однако это не удаляет атрибут класса.

Значительный поиск ничего не дал работоспособного. Я думаю, что тот факт, чтоclass используется как в HTML, так и в Python. Многие из результатов, похоже, также имеют дело исключительно с xml.

Я открыт для других модулей Python, которые также предлагают гуманные интерфейсы.

Большое спасибо.


Solution

Благодаря ответу @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)
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Jeff
  • Благодарю. Я полагаю, если люди достаточно хороши, чтобы помочь мне, я должен заплатить это вперед и сделать это легко для них и других в будущем :)

    от Jeff
  • clean=re.sub('class=".*?"','', html) - не смог устоять

    от polvoazul
  • +1 за форматирование вопроса.

    от Joao Figueiredo
  • 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>
    

  • 15

    Я не могу проверить это в данный момент, но, похоже, это общая идея

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