我想用lxml的etree解析文本文件(本地存储).但是我的所有文件(数千个)都有标题,例如:
-----BEGIN PRIVACY-ENHANCED MESSAGE----- Proc-Type: 2001,MIC-CLEAR Originator-Name: webmaster@www.sec.gov Originator-Key-Asymmetric: MFgwCgYEVQgBAQICAf8DSgAwRwJAW2sNKK9AVtBzYZmr6aGjlWyK3XmZv3dTINen TWSM7vrzLADbmYQaionwg5sDW3P6oaM5D3tdezXMm7z1T+B+twIDAQAB MIC-Info: RSA-MD5,RSA,AHxm/u6lqdt8X6gebNqy9afC2kLXg+GVIOlG/Vrrw/dTCPGwM15+hT6AZMfDSvFZ YVPEaPjyiqB4rV/GS2lj6A== <SEC-DOCUMENT>0001193125-07-200376.txt : 20070913 <SEC-HEADER>0001193125-07-200376.hdr.sgml : 20070913 <ACCEPTANCE-DATETIME>20070913115715 ACCESSION NUMBER: 0001193125-07-200376 CONFORMED SUBMISSION TYPE: 10-K PUBLIC DOCUMENT COUNT: 7 CONFORMED PERIOD OF REPORT: 20070630 FILED AS OF DATE: 20070913 DATE AS OF CHANGE: 20070913
和第一个<在这种情况下直到第51行(并且在所有情况下都不是51). xml部分如下所示:
</SEC-HEADER> <DOCUMENT> <TYPE>10-K <SEQUENCE>1 <FILENAME>d10k.htm <DESCRIPTION>FORM 10-K <TEXT> <HTML><HEAD> <TITLE>Form 10-K</TITLE> </HEAD> <BODY BGCOLOR="WHITE"> <h5 align="left"><a href="#toc">Table of Contents</a></h5>
我可以使用lxml动态处理吗?或者我应该使用流编辑器来省略每个文件的标题?谢谢!
from lxml import etree f = etree.parse('temp.txt') XMLSyntaxError: Start tag expected,'<' not found,line 1,column 1
编辑:
解决方法
鉴于这些文件有一个标准,可以编写一个合适的解析器而不是猜测事物,或希望beautifulsoup能够把事情弄清楚.这并不意味着它对你来说是最好的答案,但它肯定是看起来的工作.
根据http://www.sec.gov/info/edgar/pdsdissemspec910.pdf的标准,您所拥有的(在PEM机箱内)是由提供的DTD定义的SGML文档.所以,首先转到第48-55页,在那里提取文本,并将其保存为“edgar.dtd”.
我要做的第一件事是安装SP并使用它的工具来确保文件确实有效并且可以被DTD解析,以确保你不会浪费大量时间在不会泛的东西上出.
Python附带了一个验证的SGML解析器sgmllib.不幸的是,它从未完全完成,并且在2.6-2.7中被弃用(并在3.x中删除).但这并不意味着它不起作用.所以,试一试,看看它是否有效.
如果没有,我不知道Python有什么好的选择;大多数SGML代码都是C,C或Perl.但是你可以很容易地包装任何C或C库(我从SP开始),只要你习惯用C/C++ython / boost-python /无论使用ctypes编写自己的包装.您只需要包装顶级函数,而不是构建一组完整的绑定.但如果你以前从未做过这样的事情,那可能不是最好的学习时间.
或者,您可以包装命令行工具. SP附带nsgmls.还有另一个用perl编写的同名工具(我认为是http://savannah.nongnu.org/projects/perlsgml/的一部分,但我不是肯定的.)还有其他几十种工具.
或者,当然,您可以在perl(或C)而不是Python中编写整个内容,或仅编写解析层.