これは確かに簡単なものですが、本当に私を悩ませています。
Webページを読み取り、 Beautiful Soup を使用して解析するスクリプトがあります。最終的な目標はlink.contentsを印刷することなので、soupからすべてのリンクを抽出します。
解析するテキストはすべてASCIIです。 Pythonは文字列をUnicodeとして扱うことを知っていますが、これは非常に便利であり、私のスクリプトでは役に立たないでしょう。
'String'を保持する変数を出力するたびに、画面に[u'String']
が出力されます。これを単にasciiに戻す簡単な方法はありますか、それを取り除くために正規表現を書く必要がありますか?
[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)
おそらく、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)
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r))
印刷します
{'name': 'A', 'primary_key': 1}
単一の要素リストにアクセス/印刷する場合(例:順次またはフィルタリング):
my_list = [u'String'] # sample element
my_list = [str(my_list[0])]
出力をstr()関数に渡すと、Unicode出力の変換が削除されます。また、出力を印刷することで、u ''タグを削除します。
[u'String']
は、Python 2上のUnicode文字列を含むリストのテキスト表現です。
print(some_list)
を実行すると、次と同等ですprint'[%s]' % ', '.join(map(repr, some_list))
すなわち、タイプlist
、repr()
関数を持つ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を生成します(破損したデータはパイプラインでさらに渡されます)。
本当にu'String'
を意味しますか?
いずれにしても、ユニコード文字列ではなく文字列を取得するためにstr(string)
を実行することはできませんか? (これは、すべての文字列がユニコードであるPython 3では異なるはずです。)
'string'でdir
またはtype
を使用して、それが何であるかを調べます。文字列のように表示されるBeautifulSoupのタグオブジェクトの1つであると思われますが、実際にはそうではありません。それ以外の場合は、リスト内にあり、各文字列を個別に変換する必要があります。
いずれにせよ、ユニコードの使用に反対する理由は何ですか?具体的な理由は?