-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 に答える