2017-12-08 7 views
1

私はPythonとすべてのものが新しく、このページのこの1つのテーブルから特定のセルから数値を返すようにしています 同じウィキ内の他の類似したページ)BeautifulSoupを使用してテーブル内のセルから値を抽出する

今の私が持っているすべては、次のとおりです。

url = ('http://unisonleague.wikia.com/wiki/Brynhildr,_Dual_Lancer_(Gear)') 
r = requests.get(url) 
data = r.text 
soup = BeautifulSoup (data , 'html.parser') 
table = soup.find (id='mw-content-text') 
rows = table.find ('tr') 
cells = rows.findAll('td') 

私が欲しい値が、この中で「マックス・ユニゾン・チャンス」の隣のセルからなので、「10004」場合。

<td colspan="2" style="background-color:#5B4F3D; color:#ffffff;"> 10004 </td> 

私は

soup.findAll('td colspan="2"') 

soup.find('td colspan') 

を試みたが、それだけで何もまたは空のリストを返しません。

ここからどこに行かないのか分かりませんが、行数(これは行[14]と考えています)と多分セルでインデックスを作成しようと思っていましたが、コードを取得できませんでした右?

+0

xpath – bigbounty

+0

を使用すると便利です。[最小限、完全で、検証可能] [https://stackoverflow.com/help/mcve]つまり、実行する必要がありますスタンドアローン。 – mikuszefski

答えて

1

あなたのように、あなたの利点にHTMLのツリー構造を使用しているようなトップダウンのアプローチを行う代わりに。私はこれを他の同様のフォーマットのページに一般化したいと思っています。あなたができることは、 "Max Unison Chance"でセルをアンカーポイントとして扱い、Beautiful Soupが作成する構文木をトラバースすることですあなたが探しているセル。

element = soup.find(text='Max Unison Chance') 
:ここでここでは、直接呼び出すことによって、「マックス・ユニゾンチャンス」を含むHTMLタグを取得することができます説明セルとあなたが/

<td style="height: 29px; background-color:#3F2D18; color:#ffffff; font-size:7pt;"> <b><span style="cursor:help;" title="Maximum stats used during a Unison Chance. It is the total of both stats with +198.">Max Unison Chance</span>:</b> 
</td><td colspan="2" style="background-color:#5B4F3D; color:#ffffff;"> 10004 
</td> 

探しているセルの両方を含むHTMLです

これは "Max Unison Chance"というテキストを持つ要素を取得します。 次に、探している番号を含むタグが、現在持っている要素との相対的な位置にあるかどうかを調べると、 10004のセルの横にある要素に到達するには、3つのノードに移動する必要があることがわかります。我々は我々が持っている要素の親属性を使用して、連鎖の属性を使用することができ、このセルに移動するには

great_grandparent = element.parent.parent.parent

我々は今では私たちのgreat_grandparentのnext_siblingを取得する必要があります:

target_cell = great_grandparent.next_sibling 

最後に、要素のテキスト値を取得して、それをクリーンアップします。

そして、一緒にそれをすべて置く:次ので

result = cell.next.next.next.strip() 

from bs4 import BeautifulSoup 
import requests 
url = ('http://unisonleague.wikia.com/wiki/Brynhildr,_Dual_Lancer_(Gear)') 
r = requests.get(url) 
data = r.text 
soup = BeautifulSoup (data , 'html.parser') 
element= soup.find(text='Max Unison Chance') 
result = element.parent.parent.parent.next_sibling.text.strip() 

をこれを行うための別の方法は、あなたがして、結果を置き換えることができますので、代わりに木のオーダーの解析順序を使用しないで属性は、使用しているパーサーの仕組みに基づいて次の要素を参照します。

+1

'result = element.find_next( 'td')。text'もここでもうまくいくと思います。 – Marty

+1

このような徹底的な答えをありがとう!それは本当にうまく動作し、私は実際にすべてを理解しています。 – Prao

関連する問題