web-dev-qa-db-ja.com

Python文字列は[u'String ']として出力されます

これは確かに簡単なものですが、本当に私を悩ませています。

Webページを読み取り、 Beautiful Soup を使用して解析するスクリプトがあります。最終的な目標はlink.contentsを印刷することなので、soupからすべてのリンクを抽出します。

解析するテキストはすべてASCIIです。 Pythonは文字列をUnicodeとして扱うことを知っていますが、これは非常に便利であり、私のスクリプトでは役に立たないでしょう。

'String'を保持する変数を出力するたびに、画面に[u'String']が出力されます。これを単にasciiに戻す簡単な方法はありますか、それを取り除くために正規表現を書く必要がありますか?

127
gnuchu

[u'ABC']は、Unicode文字列の1要素リストです。 Beautiful Soupは常にUnicodeを生成します 。そのため、リストを単一のUnicode文字列に変換してから、ASCIIに変換する必要があります。

どのようにして1要素リストを取得したかはわかりません。コンテンツメンバーは文字列とタグのリストになりますが、これは明らかにあなたのものではありません。常に単一の要素を持つリストを取得し、テストが実際にonlyASCIIであると仮定すると、これを使用します。

 soup[0].encode("ascii")

ただし、データが本当にASCIIであることを再確認してください。これは非常にまれです。より可能性が高いのは、latin-1またはutf-8です。

 soup[0].encode("latin-1")


 soup[0].encode("utf-8")

または、Beautiful Soupに元のエンコーディングが何であるかを尋ね、このエンコーディングでそれを取得します。

 soup[0].encode(soup.originalEncoding)
108
oefe

おそらく、1つのUnicode文字列を含むリストがあります。このrepr[u'String']です。

次のバリエーションを使用して、これをバイト文字列のリストに変換できます。

# Functional style.
print map(lambda x: x.encode('ascii'), my_list)

# List comprehension.
print [x.encode('ascii') for x in my_list]

# Interesting if my_list may be a Tuple or a string.
print type(my_list)(x.encode('ascii') for x in my_list)

# What do I care about the brackets anyway?
print ', '.join(repr(x.encode('ascii')) for x in my_list)

# That's actually not a good way of doing it.
print ' '.join(repr(x).lstrip('u')[1:-1] for x in my_list)
24
ddaa
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

印刷します

{'name': 'A', 'primary_key': 1}
8
osmjit

単一の要素リストにアクセス/印刷する場合(例:順次またはフィルタリング):

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]
7
gevang

出力をstr()関数に渡すと、Unicode出力の変換が削除されます。また、出力を印刷することで、u ''タグを削除します。

4
waweru

[u'String']は、Python 2上のUnicode文字列を含むリストのテキスト表現です。

print(some_list)を実行すると、次と同等です
print'[%s]' % ', '.join(map(repr, some_list))すなわち、タイプlistrepr()関数を持つPythonオブジェクトのテキスト表現を作成するために、各アイテムに対して呼び出されます。

Pythonオブジェクトとそのテキスト表現を混同しないでくださいrepr('a') != 'a'そして、テキスト表現のテキスト表現でさえ異なります:repr(repr('a')) != repr('a')

repr(obj)は、オブジェクトの印刷可能な表現を含む文字列を返します。その目的は、REPLでのデバッグに役立つオブジェクトの明確な表現にすることです。多くの場合eval(repr(obj)) == obj

repr()の呼び出しを避けるために、リスト項目を直接印刷できます(すべてUnicode文字列の場合)。例:print ",".join(some_list)—文字列のコンマ区切りリストを印刷します:String

ハードコードされた文字エンコードを使用してUnicode文字列をバイトにエンコードしないでください。代わりにnicodeを直接印刷を使用してください。そうでない場合、たとえば、非ASCII文字で'ascii'エンコードを使用しようとすると、エンコードがすべての文字を表すことができないため、コードが失敗する可能性があります。または、環境がハードコーディングされたエンコーディングと互換性のないエンコーディングを使用している場合、コードは黙ってmojibakeを生成します(破損したデータはパイプラインでさらに渡されます)。

2
jfs

本当にu'String'を意味しますか?

いずれにしても、ユニコード文字列ではなく文字列を取得するためにstr(string)を実行することはできませんか? (これは、すべての文字列がユニコードであるPython 3では異なるはずです。)

2
Andrew Jaffe

'string'でdirまたはtypeを使用して、それが何であるかを調べます。文字列のように表示されるBeautifulSoupのタグオブジェクトの1つであると思われますが、実際にはそうではありません。それ以外の場合は、リスト内にあり、各文字列を個別に変換する必要があります。

いずれにせよ、ユニコードの使用に反対する理由は何ですか?具体的な理由は?

2
sykora