【问题标题】:Parsing many HTML documents with BeautifulSoup and Python使用 BeautifulSoup 和 Python 解析许多 HTML 文档
【发布时间】:2013-02-14 19:23:09
【问题描述】:

我的 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.

【问题讨论】:

  • 这不是 HTML。差远了!可能是 XML 吗?
  • 文件格式为 html,而文件本身是语言语料库的一部分..
  • 我不明白——无论您在此处发布的内容都是不是 HTML。您是在问我们如何解析一些您没有显示的 HTML 吗?另外,尝试过的代码在哪里?
  • 是的,那也是我的帖子,除了我得到的答案不是 100% 有效,所以我决定提供更多代码。这些文件的格式是“.html”,但这是它们的格式。

标签: python html beautifulsoup


【解决方案1】:

据我所知,这不是 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))

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

【讨论】:

  • 这不是重复的,因为其他答案没有提供有关 几个 html 文档的信息。我很抱歉你这么想。不过谢谢你的回答。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2020-02-06
  • 2014-03-06
相关资源
最近更新 更多