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>