Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lxml删除<;中的空格和换行符;头>;_Python_Python 3.x_Html Parsing_Lxml - Fatal编程技术网

Python lxml删除<;中的空格和换行符;头>;

Python lxml删除<;中的空格和换行符;头>;,python,python-3.x,html-parsing,lxml,Python,Python 3.x,Html Parsing,Lxml,这个小程序: from lxml.html import tostring, fromstring e = fromstring(''' <html><head> <link href="/comments.css" rel="stylesheet" type="text/css"> <link href="/index.css" rel=&q

这个小程序:

from lxml.html import tostring, fromstring
e = fromstring('''
<html><head>
        <link href="/comments.css" rel="stylesheet" type="text/css">
        <link href="/index.css" rel="stylesheet" type="text/css">
    </head>
    <body>
        <span></span>
        <span></span>
    </body>
</html>''')

print (tostring(e, encoding=str)) #unicode on python 2
从lxml.html导入到字符串,从字符串
e=fromstring(“”)
''')
在python 2上打印(tostring(e,encoding=str))#unicode
将打印:

<html><head><link href="/comments.css" rel="stylesheet" type="text/css"><link
href="/index.css" rel="stylesheet" type="text/css"></head><body>
        <span></span>
        <span></span>
    </body></html>

删除头部中的空格和换行符。 即使我们将这两个元素放在一起,也会发生这种情况。 似乎删除了head元素之间的空白文本节点(\s*)

如何在s之间保留空格和换行符?(我希望输出与输入完全相同)

对我来说

print(tostring(e,encoding=str))

返回

>>> print (tostring(e, encoding=str))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/lxml/html/__init__.py", line 1493, in tostring
    encoding=encoding)
  File "lxml.etree.pyx", line 2836, in lxml.etree.tostring (src/lxml/lxml.etree.c:53416)
TypeError: descriptor 'upper' of 'str' object needs an argument
您需要从lxml导入etree
,导入etree

当输出到输出文件时,空格和换行符将保持不变。也可使用
打印

>>> print(etree.tostring(e, pretty_print=True))
<html>
  <head>
    <link href="/comments.css" rel="stylesheet" type="text/css"/>
    <link href="/index.css" rel="stylesheet" type="text/css"/>
  </head>
  <body>
        <span/>
        <span/>
    </body>
</html>

最后,我使用html5lib解析html并用它生成类似lxml的树


parser=html5lib.HTMLParser(tree=html5lib.getTreeBuilder(“lxml”),namespacehtmlements=False)

我使用Python3,Python2使用unicode
。我猜这个例外是因为旧版本的lxml。似乎您是从package manager安装lxml,而不是使用easy_install.pretty_print Reaginate元素!我想保留空间,但不是美化。事实上,我希望从用户那里获取输入,而不是用from_string然后再改为_string。啊,python3可能会解释语法上的一些小分歧。我仍然推荐
pretty\u print=True
,从我的输出来看,它会按照您的问题执行,保留空格和换行符。也许可以使用
pretty\u print=True
及其输出更新您的问题,并将其与所需输出进行对比。因为,我不太清楚你现在问什么。注意,请使用
etree.tostring
查看问题的编辑版本。我希望输出与输入完全相同。pretty_print=True在和之间添加一个\n。这实际上不会保留格式,它只会重新创建一些类似于此示例的内容…lxml用于解析和创建XML和HTML。输出的内容保证具有正确的语法,并可使用其他工具进行解析,等等。不能保证它将保留格式,因为这不是lxml的目标。如果您想在保留HTML格式的同时修改HTML(为什么要这样做?),那么lxml是错误的工具。尽管您可能会使用不同的解析器或标记器。但这不值得付出努力。解释为什么需要保留空白。通常不会。输入由用户提供,我使用lxml检查和清理语法。如果输入没有错误,我想给用户相同的输入。因此,如果输入没有错误,请返回原始?:-)您可能需要研究htmltidy或其他已经做到这一点的工具。我相信BeautifulSoup会保留空白,但Python 3的支持还不是很好。BeautifulSoup(3.1.0.1,与Python 3兼容的最新版本)不保留空白!更新:现已修复(使用lxml 3.4.2)
>>> print(etree.tostring(e, pretty_print=True))
<html>
  <head>
    <link href="/comments.css" rel="stylesheet" type="text/css"/>
    <link href="/index.css" rel="stylesheet" type="text/css"/>
  </head>
  <body>
        <span/>
        <span/>
    </body>
</html>
    >>> import re
    >>> newString = re.sub('\n  ', '', etree.tostring(e,encoding=unicode,pretty_print=True), count=1)
    >>> print(newString)
      <html><head>
            <link href="/comments.css" rel="stylesheet" type="text/css"/>
            <link href="/index.css" rel="stylesheet" type="text/css"/>
         </head>
         <body>
           <span/>
           <span/>
        </body>
   </html>