2017-10-13 10 views
0

私はwikipediaのテーブルからデータをスクラップしようとしています。テーブルのほとんどのカラムからデータを抜き出す方法を理解しているうちに、カラムに "span"タグと "a"タグがあるため、スクラップするのが難しいカラムが1つあります。PythonでWebスクレイピング中にテーブルからイメージを削除する

具体的には、このページの「アクティブコード」セクションの下の表を参照する場合:https://en.wikipedia.org/wiki/ISO_4217あなたは第5列は、(「スパン」タグの内部で)国の旗の画像が含まれていることがわかりますだけでなく、国名( "a"タグの内側)。誰もがこのテーブルの5番目の列のタグから "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 = ""

関連する問題