Есть ли способ отключить urlencoding атрибутов привязки в lxml - PullRequest
5 голосов
/ 13 января 2011

Я использую lxml 2.2.8 и пытаюсь преобразовать некоторые существующие html-файлы в шаблоны django.Единственная проблема, с которой я сталкиваюсь, заключается в том, что lxml urlencodes кодирует имя привязки и атрибуты href.например:

<xsl:template match="a">
<!-- anchor attribute href is urlencoded but the title is escaped -->
<a href="{{{{item.get_absolute_url}}}}" title="{{{{item.title}}}}">
    <!-- name tag is urlencoded -->
    <xsl:attribute name="name">{{item.name}}</xsl:attribute>
    <!-- but other attributes are not -->
    <xsl:attribute name="nid">{{item.nid}}</xsl:attribute>
    <xsl:attribute name="class">{{item.class_one}}</xsl:attribute>
    <xsl:apply-templates/>
</a>

создает HTML следующим образом:

<a href="%7B%7Bitem.get_absolute_url%7D%7D"  
   title="{{item.title}}" name="%7B%7Bitem.name%7D%7D" 
   nid="{{item.nid}}" class="{{item.class_one}}">more info</a>

я пытаюсь это:

<a href="{{item.get_absolute_url}}">more info</a>

являетсяЕсть ли способ отключить (автоматическое) urlencoding, что делает lxml?

вот (в основном) код, который я использую для генерации и анализа файла:

from lxml import etree, html
from StringIO import StringIO

doc = StringIO(
'''<html>
<head>
    <title>An experiment</title>
</head>
<body>
<p class="one">This is an interesting paragraph detailing the inner workings of something</p>
<p class="two">paragraph with <a href="/link/to/more">more info</a></p>
<p>posted by: me</p>
</body>
</html>''')

stylesheet = StringIO(
'''<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xhtml xsl">
<xsl:template match="p[@class='one']">
    <xsl:copy>
        <!-- when adding an attribute with the xsl:attribute tag -->
        <!-- the curly braces are not escaped, ie you dont have  -->
        <!-- to double them up -->
        <xsl:attribute name="class">{{item.class_one}}</xsl:attribute>
        <xsl:attribute name="nid">{{item.nid}}</xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="p[@class='two']">
    <!-- but double 'em up in this instance -->
    <p class="{{{{item.class_two}}}}">
        <xsl:apply-templates/>
    </p>
</xsl:template>

<xsl:template match="a">
    <!-- anchor attribute href is urlencoded but the title is escaped -->
    <a href="{{{{item.get_absolute_url}}}}" title="{{{{item.title}}}}">
        <!-- name tag is urlencoded -->
        <xsl:attribute name="name">{{item.name}}</xsl:attribute>
        <!-- but oher attributes are not -->
        <xsl:attribute name="nid">{{item.nid}}</xsl:attribute>
        <xsl:attribute name="class">{{item.class_one}}</xsl:attribute>
        <xsl:apply-templates/>
    </a>
</xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>
''')
def parse_doc():
    xsl = etree.parse(stylesheet)
    trans = etree.XSLT(xsl)
    root = html.parse(doc, etree.HTMLParser(encoding="windows-1252"))
    transformed = trans(root)
    print html.tostring(transformed)

if __name__ == '__main__':
    parse_doc()

за исключениемчто эти файлы все искажены html:)

Ответы [ 2 ]

4 голосов
/ 13 января 2011

Может быть, вы можете использовать XML вместо сериализатора HTML.

>>> from lxml import etree, html
>>> 
>>> t = etree.XML('<a href="{{x}}" />')
>>> 
>>> etree.tostring(t)
'<a href="{{x}}"/>'
>>> html.tostring(t)
'<a href="%7B%7Bx%7D%7D"></a>'
3 голосов
/ 13 января 2011

Похоже, что должен быть правильным выводом для html метода сериализации.

С http://www.w3.org/TR/xslt#section-HTML-Output-Method

Метод вывода html должен выйти не-ASCII символы в атрибуте URI значения с использованием метода, рекомендованного в Раздел B.2.1 HTML 4.0 Рекомендация.

Для XSLT 2.0 от http://www.w3.org/TR/xslt-xquery-serialization/#HTML_ESCAPE-URI-ATTRIBUTES

Если escape-uri-attributes параметр имеет значение yes, Метод вывода HTML ДОЛЖЕН применить URI экранирование от до атрибута URI значения , за исключением того, что относительные URI НЕ ДОЛЖЕН быть абсолютизированным.

...