【问题标题】:lxml etree.iterparse error "TypeError: reading file objects must return plain strings"lxml etree.iterparse 错误“TypeError:读取文件对象必须返回纯字符串”
【发布时间】:2012-05-01 19:16:57
【问题描述】:

我想使用 lxml 解析 HTML 文档。我正在使用 python 3.2.3 和 lxml 2.3.4 (http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml)

我正在使用etree.iterparse 解析文档,但它返回以下运行时错误:

Traceback (most recent call last):
  File "D:\Eclipse Projects\Python workspace\Crawler\crawler.py", line 12, in <module>
    for event, elements in etree.iterparse(some_file_like):
  File "iterparse.pxi", line 491, in lxml.etree.iterparse.__next__ (src/lxml\lxml.etree.c:98565)
  File "iterparse.pxi", line 512, in lxml.etree.iterparse._read_more_events (src/lxml\lxml.etree.c:98768)
TypeError: reading file objects must return plain strings

问题是:如何解决这个运行时错误?

非常感谢。

代码如下:

from io import StringIO
from lxml import etree

some_file_like = StringIO("<root><a>data</a></root>")

for event, elements in etree.iterparse(some_file_like): #<-- Run-time error happens here
    print("%s, %4s, %s" % (event, elements.tag, elements.text))

【问题讨论】:

    标签: python lxml elementtree iterparse


    【解决方案1】:

    您的 StringIO 缓冲区有 unicode 字符串。 iterparse 适用于返回字节的文件类对象。以下缓冲区应与 iterparse 一起使用:

    from io import BytesIO
    some_file_like = BytesIO("<root><a>data</a></root>".encode('utf-8'))
    

    【讨论】:

    • 感谢您的反馈。我尝试了你的建议,但它给出了以下运行时错误:TypeError: initial_value must be str or None, not bytes
    • 显然您需要将BytesIO 用于字节,将StringIO 用于字符串(不像旧的StringIO 可以同时用于两者)。修正了我的答案。
    • 我有一个需要作为字节处理的 unicode 文件。我该怎么做?
    • @user 我认为你应该以二进制模式打开文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2017-11-20
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多