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


142

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

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

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

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


より明確に
記述さ

これはあなたの質問に答えますか?Python文字列のuプレフィックスは何ですか?
Terrabits

回答:


118

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

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

 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)

6
OPは文字列reprしか表示しないので、実際にエンコードを行う必要はありません。これは、リストを印刷するときに何が表示されるかということです。soup [0]は、reprの代わりにstrを表示するのに十分です。引用符とユニコード修飾子ではなく、文字列の内容を表示します。
ironfroggy 2009年

2
あなたは、ほとんどの場合、バイトにUnicodeとして表されたテキストをエンコードしないでください。あなたが直接PythonでUnicodeを印刷する必要があります:print(', '.join([u'ABC' , u'...']))
JFS

26

おそらく、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)

1
のような恐怖を避けてくださいrepr(x).lstrip('u')[1:-1]print ", ".join(my_list)Unicode文字列のリストをフォーマットするには、代わりに次のようなものを使用します。
jfs

1
コメントには、「それは実際には良い方法ではない」と書かれています。それは笑いのためにここにある!
ddaa

9
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

印刷します

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

1
この方法は私にはかなり甘いように見えます、なぜ投票しないのですか?心配すべきパフォーマンスへの影響はありますか?
jrich523 2017

8

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

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

1
あなたはリストの理解をします:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang

4

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


4

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

あなたが実行した場合print(some_list)、それはに相当し、その後
print'[%s]' % ', '.join(map(repr, some_list))、すなわち、型のPythonオブジェクトのテキスト表現を作成するにはlistrepr()関数は、各項目ごとに呼び出されます。

Pythonのオブジェクトとそのテキスト表現混同しないでください - repr('a') != 'a'とテキスト表現が異なるのも、テキスト表現を:repr(repr('a')) != repr('a')

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

を呼び出さないようrepr()にするには、リストアイテムを直接print ",".join(some_list)出力します(すべてUnicode文字列の場合)。例:- 文字列のコンマ区切りリストを出力します。String

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


3

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

とにかく、なぜUnicodeの使用に反対しているのですか?具体的な理由は?


ここ数日、BeautifulSoupを見てきました。gnuchuが[u'String ']ではなくu [' string ']を取得する方法を理解できませんでした。Andrew Jaffeへの彼のコメントは、それがリストであることを証明しているようです。
batbrat 2009年

3

本当u'String'ですか?

いずれにしてstr(string)も、Unicode文字列ではなく文字列を取得するだけではいいのではないでしょうか。(これは、すべての文字列がユニコードであるPython 3では異なるはずです。)


私はもっ​​とはっきりしていたはずです。str()を使用していますが、印刷すると次のような出力が得られます。[u'ABC '] [u'DEF'] [u'GHI '] [u'JKL']データはテキストとしてWebページから削除され、データベース(Google Appstore)に挿入されて、取得および印刷されます。
gnuchu 2009年

-1

encode("latin-1") 私の場合、私を助けました:

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

-1

多分私は理解できません、なぜelement.textを取得してそれを使用する前に変換できないのですか?たとえば(なぜこれを行うのかわからないが...)Webページのすべてのラベル要素を見つけ、MyTextと呼ばれるものが見つかるまでそれらの間を反復します。

        avail = []
        avail = driver.find_elements_by_class_name("label");
        for i in avail:
                if  i.text == "MyText":

文字列をiから変換し、やりたいことをすべて実行します...元のメッセージに何か不足している可能性がありますか?それともあなたが探していたものですか?


「iから文字列を変換する」方法についての質問がある部分がありません。
Nathan Tuggy

ああ、すべてのコメントのおかげで、問題は変換する価値を得ることだと思った
Steven

しかし、公平を期すために、i.textが実際の文字列値である場合、たとえばラベル要素が[u'String '] i.textのテキスト値を持っている場合に一部の人々が提案するように、「配列から引き出す」必要はありません。ストリングになります
スティーブン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.