我有一个xml文件,该文件的每个部分在一个字段中都有一些编码问题,对于一个包含40,000个部分的文件。
我想完全删除该字段,或者只删除该字段中包含的文本。
我不能使用lxml来简单地删除字段,因为解析器在遇到第一个具有错误编码的字段时会立即返回错误。
这是第一个字段的样子:
<field name="sequence_sha1">÷?¾TŸ]°f ÜèÕ?]Mò</field>
这是我尝试使用lxml删除字段的方法:
import lxml.etree as etree
parser = etree.XMLParser(recover=True
tree = etree.parse('xml_parts.xml', parser=parser)
for sha in tree.xpath("//field[@name=\'sequence_sha1\']"):
sha.getparent().remove(sha)
运行此脚本时收到的错误是:
Traceback (most recent call last):
File "./deletesha1.py", line 7, in <module>
tree = etree.parse('xml_parts.xml', parser=parser)
File "src/lxml/etree.pyx", line 3444, in lxml.etree.parse
(src/lxml/etree.c:83185)
File "src/lxml/parser.pxi", line 1834, in lxml.etree._parseDocument
(src/lxml/etree.c:120757)
File "src/lxml/parser.pxi", line 1860, in lxml.etree._parseDocumentFromURL
(src/lxml/etree.c:121104)
File "src/lxml/parser.pxi", line 1764, in lxml.etree._parseDocFromFile
(src/lxml/etree.c:120012)
File "src/lxml/parser.pxi", line 1161, in
lxml.etree._BaseParser._parseDocFromFile (src/lxml/etree.c:114561)
File "src/lxml/parser.pxi", line 598, in
lxml.etree._ParserContext._handleParseResultDoc (src/lxml/etree.c:107738)
File "src/lxml/parser.pxi", line 709, in lxml.etree._handleParseResult
(src/lxml/etree.c:109447)
File "src/lxml/parser.pxi", line 638, in lxml.etree._raiseParseError
(src/lxml/etree.c:108301)
File "xml_parts.xml", line 104
lxml.etree.XMLSyntaxError: Input is not proper UTF-8, indicate encoding !
Bytes: 0xF7 0x3F 0xBE 0x18, line 104, column 31
第104行的错误涉及我上面列出的字段。
如果我可以删除每个部分的所有“ sequence_sha1”字段或这些字段中包含的文本,那么我将使用解析器提取相关节点。
另一个选择是尝试从文本中提取信息。
XML具有以下结构:
</table_structure>
<table_data name="parts">
<row>
<field name="part_id">2557</field>
<field name="ok">0</field>
<field name="part_name">BBa_S01288</field>
<field name="short_desc">Intermediate part from assembly 236</field>
more fields ~ 30 total
</row>
我不想要每个字段,而是从每行中只选择几个字段(大约40,000行)。由于解析模块在编码问题上遇到了麻烦(至少这是我能告诉的)。是否有一种方法可以将XML读取为文本文件,并手动提取每个感兴趣的字段,同时将其格式化为另一个数据结构(XML或JSON)?
我在这里看到了一些有关使用正则表达式的文章,但是我不明白如何使用RE来删除/替换“ sequence_sha1”>之后的所有内容,并在下一个'<'分隔符之前停止,即不删除所有内容在“ sequence_sha1“>之后,直到最后一次出现“ <”
非常感谢!