2013-03-21 4 views
4

Я использую LXML 3.1.0 (устанавливается с easy_install), и видя странный результат:lxml: clean_html заменяет тег html на div?

> from lxml.html.clean import clean_html 
> clean_html("<html><body><h1>hi</h1></body></html>") 
'<div><body><h1>hi</h1></body></div>' 

html тег заменяется div.

То же самое происходит с образцом HTML согласно http://lxml.de/lxmlhtml.html#cleaning-up-html

Что дает? Я запутался в ошибке с lxml или несовместимость версий с libxml2, или это как-то ожидалось?

+0

Нет, я не думаю, что это поведение ... Можете ли вы опубликовать более крупный * фрагмент кода? – Murkantilism

ответ

4

Я думаю, что вам нужно Cleaner, что оставляет page_structure в покое:

>>> from lxml.html.clean import Cleaner               
>>> cleaner = Cleaner(page_structure=False)           
>>> cleaner.clean_html("<html><body><h1>hi</h1></body></html>") 
'<html><body><h1>hi</h1></body></html>' 

Как описано here, page_structure является True по умолчанию. Я подозреваю, что документация на указанном вами сайте неверна или устарела.

Редактировать # 1: Еще одно подтверждение того, что это ожидаемое поведение, можно найти в тесте this в исходном коде. A pull request был отправлен для исправления документации.

Редактировать # 2: pull request был объединен с мастером с 2013-04-28.

2

Структурные части страницы, такие как <head>, <html> и <title> удаляются, если page_structure=True, который по умолчанию. Для того, чтобы изменить это:

import lxml.html.clean as clean 
content = '<html><body><h1>hi</h1></body></html>' 
cleaner = clean.Cleaner(page_structure=False) 
cleaned = cleaner.clean_html(content) 
print(cleaned) 
# <html><body><h1>hi</h1></body></html> 

Смотрите строку документации для класса clean.Cleaner:

In [105]: clean.Cleaner? 
Type:  type 
String Form:<class 'lxml.html.clean.Cleaner'> 
File:  /usr/lib/python2.7/dist-packages/lxml/html/clean.py 
Definition: clean.Cleaner(self, doc) 
Docstring: 
Instances cleans the document of each of the possible offending 
elements. The cleaning is controlled by attributes; you can 
override attributes in a subclass, or set them in the constructor. 

``scripts``: 
    Removes any ``<script>`` tags. 

``javascript``: 
    Removes any Javascript, like an ``onclick`` attribute. 

``comments``: 
    Removes any comments. 

``style``: 
    Removes any style tags or attributes. 

``links``: 
    Removes any ``<link>`` tags 

``meta``: 
    Removes any ``<meta>`` tags 

``page_structure``: 
    Structural parts of a page: ``<head>``, ``<html>``, ``<title>``. 

``processing_instructions``: 
    Removes any processing instructions. 

``embedded``: 
    Removes any embedded objects (flash, iframes) 

``frames``: 
    Removes any frame-related tags 

``forms``: 
    Removes any form tags 

``annoying_tags``: 
    Tags that aren't *wrong*, but are annoying. ``<blink>`` and ``<marquee>`` 

``remove_tags``: 
    A list of tags to remove. 

``allow_tags``: 
    A list of tags to include (default include all). 

``remove_unknown_tags``: 
    Remove any tags that aren't standard parts of HTML. 

``safe_attrs_only``: 
    If true, only include 'safe' attributes (specifically the list 
    from `feedparser 
    <http://feedparser.org/docs/html-sanitization.html>`_). 

``add_nofollow``: 
    If true, then any <a> tags will have ``rel="nofollow"`` added to them. 

``host_whitelist``: 
    A list or set of hosts that you can use for embedded content 
    (for content like ``<object>``, ``<link rel="stylesheet">``, etc). 
    You can also implement/override the method 
    ``allow_embedded_url(el, url)`` or ``allow_element(el)`` to 
    implement more complex rules for what can be embedded. 
    Anything that passes this test will be shown, regardless of 
    the value of (for instance) ``embedded``. 

    Note that this parameter might not work as intended if you do not 
    make the links absolute before doing the cleaning. 

``whitelist_tags``: 
    A set of tags that can be included with ``host_whitelist``. 
    The default is ``iframe`` and ``embed``; you may wish to 
    include other tags like ``script``, or you may want to 
    implement ``allow_embedded_url`` for more control. Set to None to 
    include all tags. 

This modifies the document *in place*. 
Constructor information: 
Definition:clean.Cleaner(self, **kw)