2017-07-17 93 views
1

我已經廣泛搜索,雖然有大量的資源可用於回答這個問題,但我似乎無法得到任何可行的答案。我在Unicode上看到了Ned Batchelder的演講(https://nedbatchelder.com/text/unipain.html),並閱讀了很多關於S.O的答案。但我仍然處於虧損狀態。如何在python列表中編碼bs4可導航字符串?

我使用Python 3和BeautifulSoup 4從維基百科中刮取並解析表。我有一個名爲fighter_B

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

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

列表中的第二和第三觀察包含與拋出一個錯誤,例如,法布里西奧·韋杜姆非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()) 

'Fabrício Werdum' in names返回True