我想从Ligue 1足球网站上抓一张桌子。特别是包含卡片和裁判员信息的表格。
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中的其他地方返回另一个表。我试图在找到所有函数之后使用[0]
,[1]
等来环绕这个,但什么都不返回。我还搜索了tr
和td
,但得到了类似的结果。我不知道为什么美味的汤会忽略这张桌子。
我要找的表格在下面的HTML代码中
<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>
我也尝试使用特定的类来搜索td
,这应该可以正常工作但是它不能在第一时间选出表格。
答案 0 :(得分:2)
问题在于(我假设)您正在观看浏览器生成的HTML代码,而您缺少的是使用javascript将该表附加到页面。
您可以使用chrome(或任何其他浏览器)进行确认,而不是&#34; Inspect&#34;,查找&#34;查看页面来源&#34;,您会注意到没有这样的服务器响应中的表。
它调用的网址是&#34; http://www.ligue1.com/stats_arbitre?competition=D1&#34;,但有一个技巧,您必须通过http标头指示该请求是XHR。如果您在浏览器中尝试使用此网址,则会得到500回复。
试试这个curl示例来检查你想要的表。
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)
...
希望有所帮助
答案 1 :(得分:0)
Selenium可以做到。
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get(url)
time.sleep(5)
htmlSource = driver.page_source