2016-03-27 132 views
2

私はPython 3で作業しています。私の目的は、1つのテーブルのdifferents値を抽出し、それらを異なるリストに入れることです。BeautifulSoup: "img alt"コンテンツを抽出するPythonのWebスクレイピング

問題は、私はtdで "img alt"の値を取ることができないということです。

これは私のコードです:

from bs4 import BeautifulSoup 
import urllib.request 

redditFile = urllib.request.urlopen("http://www.mtggoldfish.com/movers/online/all") 
redditHtml = redditFile.read() 
redditFile.close() 
soup = BeautifulSoup(redditHtml) 
all_tables = soup.find_all('table') 

right_table = soup.find('table', class_='table table-bordered table-striped table-condensed movers-table') 

#create a list 
A=[] 
B=[] 
C=[] 
D=[] 

for row in right_table.findAll("tr"): 
    cells = row.findAll('td') 
    increment = row.findAll('span') 
    colection = row.findAll('img') 
    link = row.findAll('a') 
    if len(cells) == 6: 
     A.append(cells[0].find(text=True)) 
     B.append(increment[0].find(text=True)) 
     C.append(colection[0]) 
     D.append(link[0].find(text=True)) 
print(A) 
print(B) 
print(C) 
print(D) 

このコードは、私にこの結果を与える:

['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] 
['+8.40', '+2.47', '+1.35', '+1.28', '+1.14', '+0.99', '+0.94', '+0.91', '+0.90', '+0.75'] 
[<img alt="ORI" class="sprite-set_symbols_ORI" src="//assets1.mtggoldfish.com/assets/s-407aaa9c9786d606684c6967c47739c5.gif"/>, <img alt="PRM" class="sprite-set_symbols_PRM" src="//assets1.mtggoldfish.com/assets/s-407aaa9c9786d606684c6967c47739c5.gif"/>, <img alt="8ED" class="sprite-set_symbols_8ED" src="//assets1.mtggoldfish.com/assets/s-407aaa9c9786d606684c6967c47739c5.gif"/>, <img alt="EX" class="sprite-set_symbols_EX" src="//assets1.mtggoldfish.com/assets/s-407aaa9c9786d606684c6967c47739c5.gif"/>, <img alt="TSB" class="sprite-set_symbols_TSB" src="//assets1.mtggoldfish.com/assets/s-407aaa9c9786d606684c6967c47739c5.gif"/>, <img alt="WL" class="sprite-set_symbols_WL" 

SRC = "// assets1.mtggoldfish.com/assets/s-407aaa9c9786d606684c6967c47739c5.gif"/を「ペンダントヘビ」、「ファイヤストーム」、「コー・スピリットダンサー」、「スケルティング・ターン」、「ペインティング・ページョン」、デイブレイクコロネット '、'バーウィルズの森 '

しかし、私は私が行うことができます任意のアイデアを持っていない

colection variable

(exemple最初のimg ALT値のために「ORI」である)でのIMG ALT値が必要です。みんな、これで私を助けてくれますか?事前にそんなに

おかげ

答えて

1

altタグをimgタグから削除したい場合は、テーブルからのimgタグとALT属性を抽出します。あなたは唯一の最初は、その後row.find('span')など。とrow.find('img')["alt"]を見つけ使用したい場合は、一つだけの要素をしたいように見えるときにfindAllのを使用している独自のループでは

right_table = soup.find('table', class_='table table-bordered table-striped table-condensed movers-table') 

print([img["alt"] for img in right_table.select("img[alt]")]) 
['ORI', 'PRM', '8ED', 'EX', 'TSB', 'WL', 'ROE', 'ZEN', 'FUT', 'FUT'] 

をあなたは確かにfindAllを必要としないので、1行に1つしかないページを見て、各行のalt値を与えます。

ローカルでテーブルを再作成したい場合は、私が辞書にデータを置く:

right_table = soup.find('table', class_='table table-bordered table-striped table-condensed movers-table') 


table_dict = {} 

for row in right_table.select("tr"): 
    # increase class are where increments are 
    increments = [s.text for s in row.select('span.increase')] 
    # make sure we have some data in tr 
    if increments: 
     # rank/place is first text in td, could also use find("td",{"class":"first-right"}) 
     place = int(row.td.text) 
     # text/character name is in a tag text 
     title = row.find("a").text 
     increments.append(title) 
     # get alt attribute from img tag 
     increments.append(row.find("img")["alt"]) 
     table_dict[place] = increments 

from pprint import pprint as pp 

pp(table_dict) 

出力:

{1: [u'+8.78', u'68.03', u'+15.00%', u"Jace, Vryn's Prodigy", 'ORI'], 
2: [u'+2.47', u'47.96', u'+5.00%', u"Gaea's Cradle", 'PRM'], 
3: [u'+1.95', u'20.37', u'+11.00%', u'Firestorm', 'WL'], 
4: [u'+1.73', u'23.91', u'+8.00%', u'Force of Will', 'VMA'], 
5: [u'+1.35', u'40.88', u'+3.00%', u'Ensnaring Bridge', '8ED'], 
6: [u'+1.28', u'44.02', u'+3.00%', u'City of Traitors', 'EX'], 
7: [u'+1.15', u'41.98', u'+3.00%', u'Time Walk', 'VMA'], 
8: [u'+1.01', u'28.68', u'+4.00%', u'Daze', 'NE'], 
9: [u'+1.01', u'19.96', u'+5.00%', u"Goryo's Vengeance", 'BOK'], 
10: [u'+1.00', u'3.99', u'+33.00%', u'Unearth', 'UL']} 

あなたが正確に一致し、現在のテーブルのデータが表示されます、また場合あなたはすべての受賞者がURLを変更するだけですhttp://www.mtggoldfish.com/movers-details/online/all/winners/dod

またはフィールドを壊して、ちょうど盛り付けを増やしたい場合:

for row in right_table.select("tr"): 
    increment = row.find('span',{"class":'increase'}) 
    if increment: 
     increment = increment.text 
     place = int(row.td.text) 
     title = row.select("a[data-full-image]")[0].text 
     alt = (row.find("img")["alt"]) 
     table_dict[place] = {"title":title,"alt":alt, "inc":increment} 


from pprint import pprint as pp 

pp(table_dict) 

出力:

{1: {'alt': 'ORI', 'inc': u'+8.78', 'title': u"Jace, Vryn's Prodigy"}, 
2: {'alt': 'PRM', 'inc': u'+2.47', 'title': u"Gaea's Cradle"}, 
3: {'alt': 'WL', 'inc': u'+1.95', 'title': u'Firestorm'}, 
4: {'alt': 'VMA', 'inc': u'+1.73', 'title': u'Force of Will'}, 
5: {'alt': '8ED', 'inc': u'+1.35', 'title': u'Ensnaring Bridge'}, 
6: {'alt': 'EX', 'inc': u'+1.28', 'title': u'City of Traitors'}, 
7: {'alt': 'VMA', 'inc': u'+1.15', 'title': u'Time Walk'}, 
8: {'alt': 'NE', 'inc': u'+1.01', 'title': u'Daze'}, 
9: {'alt': 'BOK', 'inc': u'+1.01', 'title': u"Goryo's Vengeance"}, 
10: {'alt': 'UL', 'inc': u'+1.00', 'title': u'Unearth'}} 
+0

パドレイク、ご協力いただきありがとうございます!あなたのプリントはとてもうまく動作します。しかし、私の問題は、私はこの値を私の変数に入れたいときです(colection = row.find( 'img')["alt"])これは私にこのエラーを示していますcolection = row.find( 'img')["alt"] TypeError: 'NoneType'オブジェクトにサブスクリプトがありません ありがとうございます。 –

+0

@CarlosRocaPin上記のコードをそのまま使用すると、必要なすべてのデータが得られます。私はaltを追加するのを忘れましたが、彼らは今編集中です –

+0

Padricちょうど私はあなたの最後の答えを読んでいます。本当にありがとう!!!!完璧に動作します!私はコードをスタッドにします。 ありがとうございます!!!!ミュシャ・グラシアス!!!! –

3

あなたは<img>ノードインスタンスを取得したら、あなたはこれを使用してALT値を取得できます。

alt_tag = img.attrs['alt'] 

あなたはIMG要素のコレクションを取得しているので、あなたそれを反復してそれぞれのaltタグを取得することができます:

tags = [] 
collection = soup.findAll("img") 
for img in collection: 
    if 'alt' in img.attrs: 
     tags.append(img.attrs['alt']) 
#do whatever you need to do with your list of alt attributes. 
print tags 
+0

トレースバック(最新の呼び出しの最後):あなたの答えのための 感謝!.. tags.append(img.attrs [ 'ALT']) KeyError例外で、私のこのエラー.. ライン27を表示する理由が、私は今いけない: 'ALT' のおかげで再び! –

+0

Python辞書(https://docs.python.org/2/library/stdtypes.html#mapping-types-dict)を使用して定義されていない要素にアクセスしようとすると、キーエラーが発生しますまだ辞書内にあります。 alt属性は必須ではないので、アクセスしようとする前に、要素に設定されていることを確認する必要があります。このチェックを表示するために私の答えを編集しました。 –

関連する問題