【问题标题】:How to strip SGML tags from a text file using Python?如何使用 Python 从文本文件中去除 SGML 标签?
【发布时间】:2016-11-10 16:14:45
【问题描述】:

我最近遇到了Standard Generalized Markup Language。我从EMILLE/CIIL Corpus 获得了 SGML 格式的语料库。这是该语料库的文档:

EMILLE Corpus Documentation

我只想提取文件中存在的文本。文档中语料库的编码和标记信息为:

文本被编码为两字节的 Unicode 文本。有关 Unicode 的更多信息。 使用 1 级 CES 兼容标记在 SGML 中标记文本。每个文件还包含一个完整的标题,用于指定文本的出处。

我很难剥离这些标签。我尝试了“正则表达式”和“美丽的汤”,但它不起作用。这是示例文本文件。我想保留的语言是旁遮普语。

【问题讨论】:

  • 这是 xml,您可以使用多个 xml 解析器。在 python 中,我最喜欢lxml - 它是libxml 库的前端并且效率很高。 ElementTree 是一个纯 python 实现。甚至不要尝试为此使用正则表达式,这对于 xml 来说非常困难。
  • 另一种选择是使用 XSLT。假设您想要文本,但您还想在<p>...</p> 边界上打断段落。这可以用 XSLT 紧凑地表达(如果有点神秘的话)。
  • 谢谢@tdelaney。我将使用lxml。完成后我会通知您。

标签: python regex unicode beautifulsoup sgml


【解决方案1】:

尝试以下方法:

from bs4 import BeautifulSoup
import requests

# Assuming this is the url where the file is
html = requests.get('http://www.lancaster.ac.uk/fass/projects/corpus/emille/MANUAL.htm').content

bsObj = BeautifulSoup(html)

textData = bsObj.findAll('p')

for item in textData:
    print item.get_text()

【讨论】:

  • 嗨,谢谢。这确实很有帮助,但是输出中缺少一些东西。我不知道为什么。我正在努力。
【解决方案2】:

或者 你可以使用简单的正则表达式;如果数据是包含以 结尾的标签的字符串,则这些标签之间的所有内容都将被丢弃,您可以将多个空格限制为一个并删除数据。

data = re.sub(r'<.*?>', '', data)
data = re.sub(r'\s+', ' ', data)
data = data.strip()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多