You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何跳过无法解析的文档?附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:28:12