2

私は Python でデコードとエンコードに取り組んできましたが、問題を解決する方法がわかりません。明らかに utf-8 でコード化されているxml テキスト ファイル ( sample ) をループし、Beautiful Soup を使用して各ファイルを解析し、ファイル内の文に 2 つの異なる単語リストから 1 つ以上の単語が含まれているかどうかを確認しています。xml ファイルは 18 世紀のものであるため、xml にある em ダッシュを保持する必要があります。以下のコードはこれを問題なく実行しますが、削除したい厄介なボックス文字も保持しています。ボックスキャラはこのキャラだと思います。

(上記のサンプル ファイルの 3682 行目に、削除したい文字の例があります。この Web ページでは、文字は「or」パイプのように見えますが、Komodo で xml ファイルを読むと、ボックスをコピーして検索エンジンに貼り付けようとすると、「or」パイプのように見えますが、コンソールに出力すると、その文字は空のボックスのように見えます)。

要約すると、以下のコードはエラーなしで実行されますが、削除したい空のボックス文字が出力されます。

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ファイルからボックスを削除する方法を知っている人はいますか? 他の人が提供できる助けに感謝します。

4

3 に答える 3

4

問題は、 と を混合していることunicodeですstr。あなたがそれを行うときはいつでも、Pythonは一方を他方に変換する必要がありsys.getdefaultencoding()ます.

例外が次の行から発生した場合:

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

… 修正は簡単です… がnoextrawhitespaceオブジェクトなのunicodeか UTF-8 エンコーディングstrオブジェクトなのかを知る必要があることを除けば)。前者の場合は、次のとおりです。

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

後者の場合は、次のとおりです。

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

しかし実際には、コード内のすべての文字列を一貫させる必要があります。2 つを混同すると、これよりも多くの場所で問題が発生します。


テストする XML ファイルがないため、独自に作成しました。

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

次に、これらの 2 行をコードの最後に追加しました (そして、何かをグロビングするのではなく、ファイルを開くためだけに少し上に追加しました)。

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

出力は次のとおりです。

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

だから、それがあなたがここで望んでいることだと思います。


* 確かに ASCII が必要な場合もありunicodeますが、オブジェクトが必要な場合は通常そうではありません…</p>

于 2013-10-22T21:56:09.233 に答える
4

これを試してください:

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

余分な「\」が足りないだけだと思います

これもうまくいくかもしれません。

print(noextrawhitespace.decode('unicode_escape').encode('ascii','ignore'))
于 2013-10-22T21:42:59.317 に答える
1

サンプルを読むと、ドキュメント内の非 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

\u2223は、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

出力:

[[truncated]] 私自身も花婿だと思っています。バックル。キッキーは彼をそんな風に思わないだろう。【余談】サゴさん。ええと、かわいそうなケッキーは良い振る舞いをしなければならないか、パディの好意を完全に失いました。このフォーチュンでの再会に応じましょうか?—いいえ。そう許されたことを心から嬉しく思います。いくつかの隣人の妻は、配偶者が彼らを去ったとき、彼らのすべての友人が飛んだ. それでは、私の運命を避けようとする妻の皆さん。現在の状態 FINIS に満足してください。

于 2013-10-23T02:56:19.737 に答える