161

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

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

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

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

4

9 に答える 9

128

[u'ABC']Unicode 文字列の 1 要素リストになります。Beautiful Soup は常に Unicode を生成します。したがって、リストを 1 つの 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)
于 2009-03-01T11:22:11.323 に答える
27

You probably have a list containing one unicode string. The repr of this is [u'String'].

You can convert this to a list of byte strings using any variation of the following:

# 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)
于 2009-03-01T11:40:24.043 に答える
8

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

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]
于 2013-02-09T06:21:39.763 に答える
3

本当にu'String'ですか?

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

于 2009-03-01T11:01:20.453 に答える
3

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

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

于 2009-03-01T11:14:19.253 に答える