如何跳过无法解析的文档?附Python解析代码及报错信息
问题场景
使用以下Python代码解析NBA赛事数据时,触发lxml.etree.XMLSyntaxError: no text parsed from document报错,需要解决该问题或跳过无法解析的文档。
原代码
def parse_html(box_score): with open(box_score, "rb") as f: html = f.read() soup = BeautifulSoup(html, features="lxml") [s.decompose() for s in soup.select("tr.over_header")] [s.decompose() for s in soup.select("tr.thead")] return soup def read_line_score(soup): line_score = pd.read_html(io.StringIO(str(soup)), attrs = {'id': 'line_score'})[0] cols = list(line_score.columns) cols[0] = "team" cols[-1] = "total" line_score.columns = cols line_score = line_score[["team", "total"]] return line_score
报错信息
Traceback (most recent call last): File "c:\Users\david\Desktop\NBA Predicter\parse_data.py", line 50, in <module> line_score = read_line_score(soup) ^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\david\Desktop\NBA Predicter\parse_data.py", line 23, in read_line_score line_score = pd.read_html(io.StringIO(str(soup)), attrs = {'id': 'line_score'})[0] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\david\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\html.py", line 1245, in read_html return _parse( ^^^^^^^ File "C:\Users\david\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\html.py", line 988, in _parse tables = p.parse_tables() ^^^^^^^^^^^^^^^^ File "C:\Users\david\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\html.py", line 248, in parse_tables tables = self._parse_tables(self._build_doc(), self.match, self.attrs) ^^^^^^^^^^^^^^^^^ File "C:\Users\david\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\html.py", line 814, in _build_doc raise XMLSyntaxError("no text parsed from document", 0, 0, 0) File "<string>", line 0 lxml.etree.XMLSyntaxError: no text parsed from document
解决方案
方案1:捕获异常跳过无效文档
直接在解析函数中捕获XMLSyntaxError,返回标识值后跳过后续处理:
import lxml.etree def read_line_score(soup): try: line_score = pd.read_html(io.StringIO(str(soup)), attrs = {'id': 'line_score'})[0] cols = list(line_score.columns) cols[0] = "team" cols[-1] = "total" line_score.columns = cols line_score = line_score[["team", "total"]] return line_score except lxml.etree.XMLSyntaxError: # 返回None标记无效文档 return None
在调用处判断并跳过:
# 假设遍历多个文档的逻辑 for box_score_path in box_score_paths: soup = parse_html(box_score_path) line_score = read_line_score(soup) if line_score is None: print(f"跳过无法解析的文档: {box_score_path}") continue # 处理有效数据的逻辑
方案2:优化解析逻辑避免报错
报错核心原因是传递给pd.read_html的内容可能不规范或目标表格不存在,可提前校验并缩小解析范围:
步骤1:提前检查目标表格是否存在
只解析目标表格而非整个soup,减少解析压力:
def read_line_score(soup): # 先查找目标表格,不存在直接返回 target_table = soup.find('table', id='line_score') if not target_table: print("未找到line_score表格") return None # 仅解析目标表格的HTML内容 line_score = pd.read_html(io.StringIO(str(target_table)))[0] cols = list(line_score.columns) cols[0] = "team" cols[-1] = "total" line_score.columns = cols line_score = line_score[["team", "total"]] return line_score
步骤2:更换HTML解析器提升兼容性
若HTML格式不规范,可使用html5lib解析器(需先安装:pip install html5lib):
line_score = pd.read_html(io.StringIO(str(target_table)), flavor='html5lib')[0]
html5lib对不规范HTML的容错性更强,能避免部分XML语法错误。
内容的提问来源于stack exchange,提问作者Cayp
相关产品推荐
相关产品推荐

