大した話じゃないけど,日本語の記事が見当たらなかったので一応.
問題
lxml.etree.parse
は***.xml.gzをそのまま読み込めるのに,lxml.etree.iterparse
は読み込めない.
parse.py
from lxml import etree
path = 'dataset/sample/sample.xml.gz'
tree = etree.parse(path)
print(tree.find('//PMID').text)
>> 1
iterparse.py
from lxml import etree
path = 'dataset/sample/sample.xml.gz'
tree = etree.iterparse(path)
print(list(tree)[0][1].text)
>> lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1
ちなみにpathを解凍したsample.xml
にすると,iterparseでも 1 が出力されます.(当然)
解決策
こんな記事があった.
https://mailman-mail5.webfaction.com/pipermail/lxml/20100103/013073.html
要約すると,parseはいろんなファイル形式に対応してるけど,iterparseはすごく単純なファイル形式しか対応してない.(たぶん)
よって,gzipモジュールを使う.
iterparse.py
from lxml import etree
import gzip
path = 'dataset/sample/sample.xml.gz'
tree = etree.iterparse(gzip.GzipFile(path))
print(list(tree)[0][1].text)
>> 1
できた.