2017-10-13 62 views
0

我試圖從維基百科上的表中抓取數據。雖然我已經想出瞭如何從表格的大多數列中刮取數據,但是我有一列難以抓取,因爲列中存在「span」標記以及「a」標記。在Python中進行網頁抓取時從表中刪除圖像

具體而言,如果您參考此頁「活動代碼」部分中的表格:https://en.wikipedia.org/wiki/ISO_4217,您將看到第五列包含國旗(在「span」標籤內)以及國名(在「a」標籤內)。有誰知道我如何從表格第五列的標籤中提取「a」標籤內的文本?到目前爲止,我已經寫了下面的代碼:

from bs4 import BeautifulSoup 
import urllib2 

wiki = "https://en.wikipedia.org/wiki/ISO_4217" 
header = {'User-Agent': 'Mozilla/5.0'} #Needed to prevent 403 error on Wikipedia 
req = urllib2.Request(wiki,headers=header) 
page = urllib2.urlopen(req) 
soup = BeautifulSoup(page, 'lxml') 

code = "" 
num = "" 
e = "" 
currency = "" 
country = "" 

table = soup.find("table", { "class" : "wikitable sortable" }) 

f = open('output.csv', 'w') 

for row in table.findAll("tr"): 
    cells = row.findAll("td") 
    #For each "tr", assign each "td" to a variable. 
    if len(cells) == 5: 
     code = cells[0].find(text=True) 
     num = cells[1].findAll(text=True) 
     #e = cells[2].find(text=True) 
     currency = cells[3].find(text=True) 
     country = cells[4].find(text=True) 

     for x in range(len(num)): 
      print(code + ", " + currency + ", " + country) 

後,我進入終端這段代碼我返回類似:

AED, United Arab Emirates dirham,   
    AFN, Afghan afghani,   
    ALL, Albanian lek, 
    ... 

但我想返回類似: AED,阿拉伯聯合酋長國迪拉姆,阿聯酋 AFN,阿富汗阿富汗尼,阿富汗 ALL,阿爾巴尼亞列克,阿爾巴尼亞 ...

感謝您的幫助。如果有任何方法可以讓我的問題更容易理解,請告訴我。我是堆棧溢出新手。我已經檢查過這些表格,以確保這樣的問題尚未得到解答,除非我錯過了一些我很確定的事情。

回答

0

這應該做的伎倆:

import requests 
from bs4 import BeautifulSoup 

page = requests.get('https://en.wikipedia.org/wiki/ISO_4217') 
soup = BeautifulSoup(page.text, 'lxml') 

table = soup.find('table', {'class': 'wikitable sortable'}) 

for row in table.find_all('tr'): 
    nodes = row.find_all('td') 
    if nodes: 
     print(nodes[0].text, nodes[3].text, nodes[4].text.strip()) 

輸出:

AED United Arab Emirates dirham United Arab Emirates 
AFN Afghan afghani Afghanistan 
ALL Albanian lek Albania 
AMD Armenian dram Armenia 
      ... 
+0

太棒了,這一個工作。 –

0

您是否意識到該專欄可以包含多個國家/地區?所以文本值可能不是存儲它們的最佳解決方案。我寧願選擇一個列表。你可以簡單地findAll鏈接(a),並獲得他們的文字:

soup = BeautifulSoup(rsp.text, 'html.parser') 
table = soup.find("table", { "class" : "wikitable sortable" }) 
for row in table.findAll("tr"): 
    cells = row.findAll("td") 
    #For each "tr", assign each "td" to a variable. 
    if len(cells) == 5: 
     code = cells[0].find(text=True) 
     num = cells[1].findAll(text=True) 
     #e = cells[2].find(text=True) 
     currency = cells[3].find(text=True) 
     countries = [country.text for country in cells[4].findAll('a')] 

你也應該注意,你可以使用requests庫,這將有利於實際的要求:

import requests 

wiki = "https://en.wikipedia.org/wiki/ISO_4217" 
rsp = requests.get(wiki) 

也只有你將for循環中的值分配給在下一個循環中被覆蓋的變量。想想這樣的:

codes = [] 
for row in table.findAll("tr"): 
    codes.append(cells[0].find(text=True)) 

最後也沒有必要像你這樣在Python中實例變量(code = ""