2017-07-17 7 views
1

私は広範囲に調査しましたが、この質問に答えるためのリソースがたくさんありましたが、実用的な回答は得られていないようです。私はUnicodeのNed Batchelder(https://nedbatchelder.com/text/unipain.html)からこの話を見て、S.O.の多くの解答を読みました。しかし、私はまだ失われています。bs4ナビゲート可能な文字列をPythonリストでエンコードする方法は?

私はPython 3とBeautifulSoup 4を使用して、ウィキペディアのテーブルを切り取り、解析しています。私はfighter_B

print(type(fighter_B)) 
    <class 'list'> 

    print(type(fighter_B[0]) 
    <class 'bs4.element.NavigableString'> 

一覧の2番目および3番目の観測値は、例えば、ファブリシオ・ヴェウドゥムがエラーをスロー非enlgish文字で名前が含まれていると呼ばれるリストを持っています。私が試してみて、私はこのエラーを取得する戦闘機の名前、

print(fighter_B[1]) 
UnicodeEncodeError: 'ascii' codec can't encode character '\xed' in position 4: ordinal not in range(128) 

を印刷するとき、私は様々なエンコーディング機能を試してみたが、私はいつも同じエラーを投げてしまいます。

[fighter.encode('utf-8') for fighter in fighter_B] 
print(fighter_B[1]) 
UnicodeEncodeError: 'ascii' codec can't encode character '\xed' in position 4: ordinal not in range(128) 

for i in fighter_B: 
    i.encode('utf-8') 
print(fighter_B[1]) 
UnicodeEncodeError: 'ascii' codec can't encode character '\xed' in position 4: ordinal not in range(128) 

[fighter.decode('utf-8') for fighter in fighter_B] 
AttributeError: 'NavigableString' object has no attribute 'decode' 

[str(fighter).decode('utf-8) for fighter in fighter_B] 
AttributeError: 'str' object has no attribute 'decode' 

[fighter.encode('ascii') for fighter in fighter_B] 
UnicodeEncodeError: 'ascii' codec can't encode character '\xed' in position 4: ordinal not in range(128) 

私が見てきた様々な答えはすべて、変数を 'utf-8'にエンコードすることを示唆しています。私はここでエンコーディングがなぜ機能していないのか分かりません。リスト内の各項目が 'bs4.element.NavigableString'型であることが原因であるかどうかは疑問です。私はこの時点で完全に困惑していると感じるので、任意のヒントは非常に高く評価されるだろう。

+0

デフォルトソースエンコーディングとは何ですか?それがutf-8なら、それは動作しているはずです。 –

+1

print(sys.getdefaultencoding())は、 "utf-8"を生成します。それは、それが動作するはずであることを意味する場合は気になります – buchmayne

+0

Python3を使用していますか? –

答えて

1

予備的な答えは:

私はあなたには、いくつかの値または値を引き出すためにHTMLのいくつかのブロックを反復処理しようとしている問題に遭遇してきましたが、それは次のようになります。

>>> for elem in li: 
    type(elem) 

<class 'bs4.element.Tag'> 
<class 'bs4.element.NavigableString'> 
<class 'bs4.element.Tag'> 
<class 'bs4.element.Tag'> 
<class 'bs4.element.NavigableString'> 
<class 'bs4.element.Tag'> 
<class 'bs4.element.NavigableString'> 
<class 'bs4.element.Tag'> 
<class 'bs4.element.NavigableString'> 
<class 'bs4.element.Tag'> 
<class 'bs4.element.NavigableString'> 
<class 'bs4.element.Tag'> 
<class 'bs4.element.NavigableString'> 
<class 'bs4.element.Tag'> 
<class 'bs4.element.NavigableString'> 

そのような場合、オブジェクトには異なるメソッドがあるため、オブジェクトを簡単に反復処理することはできません。したがって、要素のさらなる特異性を含む別のfindAllを追加することは意味をなさないでしょう。

次は実行されますか?

import requests 
from bs4 import BeautifulSoup 

url = r'https://en.wikipedia.org/wiki/List_of_male_mixed_martial_artists' 

html = requests.get(url) 
soup = BeautifulSoup(html.text, 'html.parser') 

names = [] 

for li in soup.findAll('li'): 
    for i,link in enumerate(li.findAll('a')): 
     if i == 1: 
      names.append(link.getText()) 

Trueを返す'Fabrício Werdum' in namesですか?

関連する問題