-3

我的 HTML 文本看起来像以下结构的许多实例:

<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、First 和 Text 对每个结构进行索引,以便稍后进行分析(标记化等)。

我正在考虑使用 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。

4

1 回答 1

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))

然而,这是一个非常糟糕(且重复)的问题。

于 2013-02-14T20:17:24.557 回答