2015-12-15 4 views
5

Ligue 1のサッカーのWebサイトからテーブルを削りました。具体的には、カードと審判に関する情報を含むテーブル。BeautifulSoup4(Python 3)を使用して特定のテーブルを削ることはできません

http://www.ligue1.com/LFPStats/stats_arbitre?competition=D1

私は、次のコードを使用しています:

import requests 
from bs4 import BeautifulSoup 
import csv 

r=requests.get("http://www.ligue1.com/LFPStats/stats_arbitre?competition=D1") 

soup= BeautifulSoup(r.content, "html.parser") 
table=soup.find_all('table') 

これは、HTMLのどこか別のテーブルを返します。 find all関数の後に[0][1]などを使用してこれを周回させようとしましたが、何も返しません。私もtrtdを検索しましたが、同様の結果が得られます。なぜ美しいスープがこのテーブルを無視するのか分かりません。

私が探していますテーブルは

<table> 
<thead> 
    <tr> 
    <th class="{sorter: false} hide position">Position</th> 
    <th class="{sorter: false} joueur">Referees</th> 
    <th class="chiffre header"><span class="icon icon_carton_jaune">Yellow card</span></th> 
    <th class="chiffre header"><span class="icon icon_carton_rouge">Red card</span></th> 
    <th class="chiffre header">Matches</th> 
    </tr> 
</thead> 
    <tbody><tr> 
    <td class="position"></td> 
    <td class="joueur">Benoît BASTIEN</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/245">25</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/245">4</a></td> 
    <td class="chiffre">8</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Hakim BEN EL HADJ</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/259">55</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/259">4</a></td> 
    <td class="chiffre">10</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Wilfried BIEN</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/162">44</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/162">3</a></td> 
    <td class="chiffre">9</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Ruddy BUQUET</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/269">33</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/269">2</a></td> 
    <td class="chiffre">7</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Tony CHAPRON</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/102">43</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/102">1</a></td> 
    <td class="chiffre">8</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Amaury DELERUE</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/343">30</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/343">0</a></td> 
    <td class="chiffre">6</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Saïd ENNJIMI</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/113">27</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/113">1</a></td> 
    <td class="chiffre">6</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Fredy FAUTREL</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/338">25</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/338">2</a></td> 
    <td class="chiffre">8</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Antony GAUTIER</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/331">31</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/331">8</a></td> 
    <td class="chiffre">9</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Johan HAMEL</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/334">43</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/334">7</a></td> 
    <td class="chiffre">9</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Lionel JAFFREDO</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/124">40</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/124">2</a></td> 
    <td class="chiffre">9</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Stéphane JOCHEM</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/294">33</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/294">4</a></td> 
    <td class="chiffre">8</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Stéphane LANNOY</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/127">24</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/127">0</a></td> 
    <td class="chiffre">6</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Mikael LESAGE</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/286">38</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/286">3</a></td> 
    <td class="chiffre">9</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Jérôme MIGUELGORRY</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/239">32</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/239">1</a></td> 
    <td class="chiffre">10</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Benoît MILLOT</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/287">43</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/287">0</a></td> 
    <td class="chiffre">11</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Sébastien MOREIRA</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/148">38</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/148">5</a></td> 
    <td class="chiffre">10</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Nicolas RAINVILLE</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/188">40</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/188">7</a></td> 
    <td class="chiffre">10</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Frank SCHNEIDER</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/247">33</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/247">4</a></td> 
    <td class="chiffre">10</td> 
</tr> 
    <tr class="odd"> 
    <td class="position"></td> 
    <td class="joueur">Clément TURPIN</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/333">26</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/333">3</a></td> 
    <td class="chiffre">8</td> 
</tr> 
    <tr> 
    <td class="position"></td> 
    <td class="joueur">Bartolomeu VARELA</td> 
    <td class="chiffre"><a href="/stats_arbitre_details/288">35</a></td> 
    <td class="chiffre"><a href="/stats_arbitre_details/288">3</a></td> 
    <td class="chiffre">9</td> 
</tr> 
</tbody></table> 

下記のHTMLコードである私も動作するはずだけでなく、特定のクラスでtdを探して試してみましたが、それは内のテーブルを選ぶことはできません最初の場所。

答えて

2

問題は、ブラウザによって生成されたHTMLコードを見ている(私は仮定)ということで、何が不足していることの表ではJavaScriptを使用してページに追加されていることです。

これはChrome(または他のブラウザ)を使用して確認でき、[Inspect]の代わりに[View Source]を探してください。サーバー応答にこのようなテーブルがないことがわかります。

URLは「http://www.ligue1.com/stats_arbitre?competition=D1」ですが、リクエストがXHRであることを、HTTPヘッダーで示す必要があります。このURLでブラウザを試してみると、500の応答が得られます。

このカールの例を試してみてください。あなたのコードで

curl --header "X-Requested-With: XMLHttpRequest" http://www.ligue1.com/stats_arbitre?competition=D1

は、次の操作を行います。

import requests 
from bs4 import BeautifulSoup 
import csv 

headers = {'X-Requested-With': 'XMLHttpRequest'} 
r = requests.get('http://www.ligue1.com/stats_arbitre?competition=D1', headers=headers) 

... 

は、それはそれを行うことができます

+0

こんにちは、非常に役立ちましたことを感謝します。私は端末にカールのサンプルを入力し、ブラウザーでinspectオプションを使用していたときに取得しようとしていたHTMLスクリプトを取り出しました。しかし、私のコードにあなたの提案された変更後、私はまだ私は後のHTMLを引き出すことができません。私はPythonを使ってカールを試みるべきか、それとも別の解決策がありますか?私の無礼のための謝罪私はこれにはかなり新しいです。 –

+0

私はまただけ応答を得ます –

+0

それはかなり変わったようです、私はちょうど再度テストし、それは働いた、http://www.ligue1.com/LFPStats/stats_arbitre?競争= D1から 'http: //www.ligue1.com/stats_arbitre?competition = D1'? –

0

セレンお役に立てば幸いです。

from selenium import webdriver 
import time 

driver = webdriver.Firefox() 
driver.get(url) 
time.sleep(5) 
htmlSource = driver.page_source 
関連する問題