如果<doctype>之前有换行符,则截断树

时间:2018-11-28 14:42:56

标签: python lxml

我有一个页面来自某个站点,而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的这种行为(或者我尚未测试过的东西)令人困惑。因此,在提交错误之前,也许sonmeone知道这是怎么回事?

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

(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

0 个答案:

没有答案