繁体   English   中英

Python:从字符串中删除特定字符(u“ \\ u2610”)

[英]Python: Removing particular character (u“\u2610”) from string

我一直在努力地用Python进行解码和编码,但我还不太清楚如何解决我的问题。 我正在遍历显然是utf-8编码的xml文本文件( 样本 ),使用Beautiful Soup解析每个文件,然后查看文件中是否有任何一个句子包含来自两个不同单词列表的一个或多个单词。 因为xml文件来自18世纪,所以我需要保留xml中的破折号。 下面的代码可以做到这一点,但是它也保留了我要删除的讨厌的方框字符。 我相信方块字符就是这个字符

(您可以在上面的示例文件的3682行中找到想要删除的字符的示例。在此网页上,该字符看起来像个“或”管道,但是当我在Komodo中读取xml文件时,它看起来像一个当我尝试将框复制并粘贴到搜索引擎中时,它看起来像是“或”管道。但是,当我打印到控制台时,该字符看起来像是一个空框。)

综上所述,下面的代码可以正常运行,但是会打印出我想删除的空白字符。

for work in glob.glob(pathtofiles):

    openfile = open(work)
    readfile = openfile.read()
    stringfile = str(readfile)

    decodefile = stringfile.decode('utf-8', 'strict') #is this the dodgy line?
    soup = BeautifulSoup(decodefile)

    textwithtags = soup.findAll('text')

    textwithtagsasstring = str(textwithtags)

    #this method strips everything between anglebrackets as it should
    textwithouttags = stripTags(textwithtagsasstring)

    #clean text
    nonewlines = textwithouttags.replace("\n", " ")
    noextrawhitespace = re.sub(' +',' ', nonewlines)

    print noextrawhitespace #the boxes appear

我试图通过使用删除框

noboxes = noextrawhitespace.replace(u"\u2610", "")

但是Python抛出了一个错误标志:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 280: ordinal not in range(128)

有谁知道我如何从xml文件中删除框? 我将感谢其他人可以提供的任何帮助。

试试看:

noextrawhitespace.replace("\\u2610", "") 

我想您只是想念那个多余的'\\'

这也可能起作用。

print(noextrawhitespace.decode('unicode_escape').encode('ascii','ignore'))

问题是您正在混合unicodestr 每当您执行此操作时,Python都必须使用sys.getdefaultencoding()进行转换,该转换通常是ASCII,几乎从来都不是您想要的。*

如果异常来自此行:

noboxes = noextrawhitespace.replace(u"\u2610", "")

……解决方法很简单……除了您必须知道noextrawhitespace应该是unicode对象还是UTF-8编码str对象。 如果是前者,则是这样的:

noboxes = noextrawhitespace.replace(u"\u2610", u"")

如果是后者,就是这样:

noboxes = noextrawhitespace.replace(u"\u2610".encode('utf-8'), "")

但是实际上,您必须使代码中的所有字符串保持一致。 混合这两者将在比这更多的地方引起问题。


由于我没有要测试的XML文件,因此我编写了自己的文件:

<xml>
    <text>abc&#9744;def</text>
</xml>

然后,我将这两行添加到您的代码底部(并在顶部添加了一点,以仅打开我的文件而不是为任何内容提供遍历):

noboxes = noextrawhitespace.replace(u"\u2610".encode('utf-8'), "")
print noboxes

现在的输出是:

[<text>abc☐def</text>]
[<text>abc☐def</text>]
[<text>abcdef</text>]

所以,我想这就是您想要的。


*当然有时候您需要ASCII ...但是通常不存在unicode对象的情况...

阅读示例时,以下是文档中的非ASCII字符:

0x2223 DIVIDES
0x2022 BULLET
0x3009 RIGHT ANGLE BRACKET
0x25aa BLACK SMALL SQUARE
0x25ca LOZENGE
0x3008 LEFT ANGLE BRACKET
0x2014 EM DASH
0x2026 HORIZONTAL ELLIPSIS

\∣是第3682行中有问题的实际字符,它被用作软连字符。 其他标记用于标记难以辨认的字符,例如:

<GAP DESC="illegible" RESP="oxf" EXTENT="4+ letters" DISP="\u2022\u2022\u2022\u2022\u2026"/>

这是一些代码,可以完成您的代码尝试做的事情。 确保以Unicode处理:

from bs4 import BeautifulSoup
import re

with open('k000039.000.xml') as f:
    soup = BeautifulSoup(f)  # BS figures out the encoding

text = u''.join(soup.strings)      # strings is a generator for just the text bits.
text = re.sub(ur'\s+',ur' ',text)  # Simplify all white space.
text = text.replace(u'\u2223',u'') # Get rid of the DIVIDES character.
print text

输出:

[[截短]]也把我自己当作新郎。 扣。 我怀疑奇奇不会找到他这样的人。 [在旁边。]西米夫人。 好吧,可怜的凯基(Keckky)固守良好的行为,否则她就失去了布迪(Puddy)的支持。 我要在《财富》杂志上发表这篇文章吗? 我为Heart感到宽恕而感到高兴。 一些邻居的妻子已经表现出来了,但太晚了,当配偶离开他们的时候,他们的所有朋友都被放飞了。 然后,所有想逃避我命运的妻子们。 仍然对您目前的州FINIS满意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM