首页 > 解决方案 > 如果之前有换行符,则截断树

问题描述

我有一个来自某个站点的页面,lxml 在这里表现得很奇怪。

Python 3.6.5 (default, Jun  3 2018, 00:45:25) 
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
>>> with open('1.html', newline='') as fi: text=fi.read()
>>> etree.LXML_VERSION
(4, 2, 5, 0)
>>> text[:100]
'\n<!DOCTYPE html>\n<html lang="en-US">\n<head id="ctl00_header"><meta http-equiv="X-UA-Compatible" cont'
>>> len(etree.tostring(etree.HTML(text[1:])))
455129
>>> len(etree.tostring(etree.HTML(text)))
201176
>>> etree.tostring(etree.HTML(text))[-150:]
b'ors\',&#13;&#10;  \'brand\': \'Omron\',&#13;&#10;  \'variant"/></div</td></tr></table></div></td></tr></table></div></div></div></div></form></body></html>'

在这种情况下,解析似乎突然停止在 attr 中间(它是 onclick)。我知道每个人都说 DOCTYPE 必须是第一行,但我认为 lxml 的这种行为(或下面的东西,我没有测试过)令人困惑。所以在提交错误之前,也许有人知道这是怎么回事?

更新:这更有趣。另一页。

(Pdb) p text[:20]
'\n<!DOCTYPE html>\n<ht'
(Pdb) p text[-20:]
'pt>\n</body>\n</html>\n'
(Pdb) len(etree.tostring(etree.HTML(text)))
316031
(Pdb) len(etree.tostring(etree.HTML(text.lstrip())))
259909
(Pdb) len(etree.tostring(etree.HTML(text.rstrip())))
316031
(Pdb) len(etree.tostring(etree.HTML(text.strip())))
259909
(Pdb) len(etree.tostring(etree.HTML(text.encode())))
316023

标签: pythonlxml

解决方案


推荐阅读