2013-02-14 2 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 *? –

+0

форматы файлов находятся в html, а сами файлы являются частью лингвистического корпуса. – user2070177

+0

Я не понимаю - все, что вы разместили здесь, - это не * HTML. Вы спрашиваете нас, как анализировать HTML-код, который вы не показываете? Кроме того, где код, с каким * вы * попробовали? –

ответ

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

Смежные вопросы