我正在尝试抓取这个网站:http://www.fivb.org/EN/BeachVolleyball/PlayersRanking_W.asp,但是在页面加载后,此页面会加载表格的内容(可能是通过AJAX)。
我的尝试:
import requests
from bs4 import BeautifulSoup, Comment
uri = 'http://www.fivb.org/EN/BeachVolleyball/PlayersRanking_W.asp'
r = requests.get(uri)
soup = BeautifulSoup(r.content)
print(soup)
但是id='BTechPlayM'
的div仍然是空的,无论我做什么。我试过了:
requests.get(uri, timeout=10)
有没有办法向URI发送请求,等待X秒,然后返回内容?
...或者向URI发送请求,继续检查div
是否包含元素;并且只返回内容?
答案 0 :(得分:1)
简短回答:不。你不能使用requests
。
但是,正如您所说,表数据是使用JavaScript动态生成的。数据来自this URL。但是,响应不是JSON格式;这是JavaScript。因此,根据该数据,您可以使用RegEx获取列表中可用的所需数据。
但是,RegEx返回的数据再次是字符串格式而不是实际列表。您可以使用ast.literal_eval()
将此字符串转换为列表。例如,数据如下所示:
'["1", "Humana-Paredes", "CAN", "4", "1,720", ""]'
完整代码:
import re
import requests
import ast
r = requests.get('http://www.fivb.org/Vis/Public/JS/Beach/TechPlayRank.aspx?Gender=1&id=BTechPlayW&Date=20180326')
data = re.findall(r'(\[[^[\]]*])', r.text)
for player in data:
details = ast.literal_eval(player)
print(details) # this var is a list (format shown below)
部分输出:
['1', 'Humana-Paredes', 'CAN', '4', '1,720', '']
['', 'Pavan', 'CAN', '4', '1,720', '']
['3', 'Talita', 'BRA', '4', '1,660', '']
['', 'Larissa', 'BRA', '4', '1,660', '']
['5', 'Hermannova', 'CZE', '4', '1,360', '']
['', 'Slukova', 'CZE', '4', '1,360', '']
['7', 'Laboureur', 'GER', '4', '1,340', '']
...
此列表的基本格式(details
)是:
[<Rank>, <Name>, <Country>, <Nb. part.>, <Points>, <Entry pts.>]
您可以随意使用此数据。例如,使用details[1]
将为您提供所有名称。
答案 1 :(得分:0)
您可以使用selenium,因为请求不提供wait-
选项from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup, Comment
uri = 'http://www.fivb.org/EN/BeachVolleyball/PlayersRanking_W.asp'
browser = webdriver.Chrome("./chromedriver") #download chromebrowser
browser.set_page_load_timeout(60)
browser.get(uri) #open page in browser
text = browser.page_source
browser.quit()
soup = BeautifulSoup(text)
print(soup)
您必须下载chromedriver