使用 Python 2.7 绕过文件作为 lxml iterparse 函数的字符串参数
Bypass file as parameter with a string for lxml iterparse function using Python 2.7
我正在使用 lxml.tree 函数 iterparse() 对 xml 树进行交互。
输入文件正常
xml_source = "formatted_html_diff.xml"
context = ET.iterparse(xml_source, events=("start",))
event, root = context.next()
不过,我想在文件中使用包含相同信息的字符串。
我试过使用
context = ET.iterparse(StringIO(result), events=("start",))
但这会导致以下错误:
Traceback (most recent call last):
File "c:/Users/pag/Documents/12_raw_handle/remove_from_xhtmlv02.py", line 96, in <module>
event, root = context.next()
File "src\lxml\iterparse.pxi", line 209, in lxml.etree.iterparse.__next__
TypeError: reading file objects must return bytes objects
有谁知道我该如何解决这个错误?
提前致谢。
使用 BytesIO
而不是 StringIO
。以下代码适用于 Python 2.7 和 Python 3:
from lxml import etree
from io import BytesIO
xml = """
<root>
<a/>
<b/>
</root>"""
context = etree.iterparse(BytesIO(xml.encode("UTF-8")), events=("start",))
print(next(context))
print(next(context))
print(next(context))
输出:
('start', <Element root at 0x315dc10>)
('start', <Element a at 0x315dbc0>)
('start', <Element b at 0x315db98>)
我正在使用 lxml.tree 函数 iterparse() 对 xml 树进行交互。
输入文件正常
xml_source = "formatted_html_diff.xml"
context = ET.iterparse(xml_source, events=("start",))
event, root = context.next()
不过,我想在文件中使用包含相同信息的字符串。
我试过使用
context = ET.iterparse(StringIO(result), events=("start",))
但这会导致以下错误:
Traceback (most recent call last):
File "c:/Users/pag/Documents/12_raw_handle/remove_from_xhtmlv02.py", line 96, in <module>
event, root = context.next()
File "src\lxml\iterparse.pxi", line 209, in lxml.etree.iterparse.__next__
TypeError: reading file objects must return bytes objects
有谁知道我该如何解决这个错误?
提前致谢。
使用 BytesIO
而不是 StringIO
。以下代码适用于 Python 2.7 和 Python 3:
from lxml import etree
from io import BytesIO
xml = """
<root>
<a/>
<b/>
</root>"""
context = etree.iterparse(BytesIO(xml.encode("UTF-8")), events=("start",))
print(next(context))
print(next(context))
print(next(context))
输出:
('start', <Element root at 0x315dc10>)
('start', <Element a at 0x315dbc0>)
('start', <Element b at 0x315db98>)