2013-02-14 73 views
-3

解析许多HTML文件我有HTML文本如下所示结构的许多实例:与BeautifulSoup和Python

<DOC> 
<DOCNO> XXX-2222 </DOCNO> 
<FIRST>Reports Former Saigon Officials Released from Re-education Camp</FIRST> 
<TEXT> 
Lots of text here 
</TEXT> 
</DOC> 
<DOC> 
<DOCNO> YYYY-0001 </DOCNO> 
<FIRST>AP-ONU-ISRAEL -URGENT-</FIRST> 
<TEXT> 
Text 
</TEXT> 
</DOC> 
etc, etc... 

我需要做的是索引中的每个结构,与DocNo,首先,和文本,以后再分析(标记等)。

我想使用BeautifulSoup,但我需要一起提取几件事 - 我该怎么做,并将它们链接在一起?

我想的格式,如:

[(XXX-2222, "Reports Former Saigon Officials Released from Re-education Camp", "Lots of text here"), (YYYY-0001, "AP-ONU-ISRAEL -URGENT-", "Text"), etc...) 

谢谢!

S.

+0

这不是HTML。差远了!它可能是* XML *吗? – 2013-02-14 19:38:31

+0

文件格式是在HTML中,而文件本身是语言语料库的一部分.. – user2070177 2013-02-14 19:42:18

+0

我不明白 - 无论你在这里发布的是*不* HTML。你问我们如何解析你没有显示的HTML?此外,代码与你尝试过什么? – 2013-02-14 19:44:36

回答

2

这不是从我可以告诉HTML,所以我不打算使用Beautifulsoup。下面是一个ElementTree的方法:

import xml.etree.cElementTree as ET 
from collections import namedtuple 

xml = """ 
<DOC> 
<DOCNO> XXX-2222 </DOCNO> 
<FIRST>Reports Former Saigon Officials Released from Re-education Camp</FIRST> 
<TEXT> 
Lots of text here 
</TEXT> 
</DOC> 
<DOC> 
<DOCNO> YYYY-0001 </DOCNO> 
<FIRST>AP-ONU-ISRAEL -URGENT-</FIRST> 
<TEXT> 
Text 
</TEXT> 
</DOC> 
""" 

Record = namedtuple('DOC', 'DOCNO FIRST TEXT') 

def wrapxmlfragment(fragment): 
    return '<root>{}</root>'.format(fragment) 

def getrecords(xml): 
    """Return list of records contained in an xml string""" 
    docs = ET.fromstring(xml) 
    return [recordfromDOC(doc) for doc in docs.findall('DOC')] 

def recordfromDOC(DOC): 
    return Record(
     DOC.find('DOCNO').text.strip(), 
     DOC.find('FIRST').text.strip(), 
     DOC.find('TEXT').text.strip() 
    ) 

print records 
firstrecord = records[0] 
print firstrecord[0] 
print firstrecord.DOCNO 

可以很容易地扩展,以从文件列表工作:

def getrecordsfromfiles(filelist): 
    records = [] 
    for filename in filelist: 
     with open(filename, 'rb') as fp: 
      records.extend(getrecords(wrapxmlfragment(fp.read()))) 
    return records 

records = getrecords(wrapxmlfragment(xml)) 

然而,这是一个非常贫穷的(正,副本)的问题。

+0

这不是重复的,因为其他答案没有提供有关_several_ html文件的信息。对不起,你这样想。但是,谢谢你的回答。 – user2070177 2013-02-15 20:29:12