lxml.etree.ParserError: Document is empty报错是否由网页加载不全导致?
你推测的页面加载不完全是这个报错的常见触发原因,判断成立,除此之外还有其他场景也会触发该错误。
报错本质
lxml.etree.ParserError: Document is empty 报错的核心原因是传入lxml解析器的待解析内容为空,解析器无法基于空内容构建DOM结构,因此抛出错误。从你提供的报错堆栈可以定位到,问题出现在self._parser = HTML(html=text)这一行,你传入的text变量是空值,向下传递到lxml解析环节触发报错。
# 完整报错堆栈 Traceback (most recent call last): File "/home/ubuntu/.local/share/virtualenvs/Project-RDkr7CyY/lib/python3.7/site-packages/pyquery/pyquery.py", line 57, in fromstring result = getattr(etree, meth)(context) File "src/lxml/etree.pyx", line 3213, in lxml.etree.fromstring File "src/lxml/parser.pxi", line 1877, in lxml.etree._parseMemoryDocument File "src/lxml/parser.pxi", line 1765, in lxml.etree._parseDoc File "src/lxml/parser.pxi", line 1127, in lxml.etree._BaseParser._parseDoc File "src/lxml/parser.pxi", line 601, in lxml.etree._ParserContext._handleParseResultDoc File "src/lxml/parser.pxi", line 711, in lxml.etree._handleParseResult File "src/lxml/parser.pxi", line 640, in lxml.etree._raiseParseError File "<string>", line 1 lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1 Traceback (most recent call last): File "/home/ubuntu/services/Project/src/parser.py", line 9, in __init__ self._parser = HTML(html=text) File "/home/ubuntu/.local/share/virtualenvs/projects-RDkr7CyY/lib/python3.7/site-packages/requests_html.py", line 421, in __init__ element=PyQuery(html)('html') or PyQuery(f'<html>{html}</html>')('html'), File "/home/ubuntu/.local/share/virtualenvs/projects-RDkr7CyY/lib/python3.7/site-packages/pyquery/pyquery.py", line 217, in __init__ elements = fromstring(context, self.parser) File "/home/ubuntu/.local/share/virtualenvs/projects-RDkr7CyY/lib/python3.7/site-packages/pyquery/pyquery.py", line 61, in fromstring result = getattr(lxml.html, meth)(context) File "/home/ubuntu/.local/share/virtualenvs/projects-RDkr7CyY/lib/python3.7/site-packages/lxml/html/__init__.py", line 876, in fromstring doc = document_fromstring(html, parser=parser, base_url=base_url, **kw) File "/home/ubuntu/.local/share/virtualenvs/projects-RDkr7CyY/lib/python3.7/site-packages/lxml/html/__init__.py", line 765, in document_fromstring "Document is empty") lxml.etree.ParserError: Document is empty
所有可能的触发场景
- 页面加载不完全:动态渲染类页面未等待JS执行完成就提取源码,或者请求未完成就提前调用解析逻辑
- 请求异常未处理:请求被反爬拦截、返回4xx/5xx状态码,响应体本身为空,未做状态校验就直接解析内容
- 本地内容读取失败:从本地读取HTML文件时,文件不存在、无读取权限、文件本身为空,导致读取到的内容为空
- 编码处理错误:响应内容编码和解码规则不匹配,解码后得到空字符串
排查修复方案
- 解析前先校验内容:传入解析器前打印
text的长度和内容,确认是否为空,为空则不执行解析逻辑 - 增加请求校验逻辑:拿到请求响应后先判断状态码是否为200,再提取响应内容
- 动态页面增加等待:使用requests-html渲染动态页面时,调用
render方法增加sleep参数,例如response.html.render(sleep=2),等待页面完全渲染后再提取源码 - 增加重试机制:空内容场景下增加请求重试逻辑,避免偶发网络波动导致的内容获取失败
内容的提问来源于stack exchange,提问作者Shehan Jayalath
相关产品推荐
相关产品推荐

