因此,作为序言,我一直在尝试抓取的网站似乎已经使用/使用了(我不确定行话是否涉及与Web开发等有关的术语)JavaScript代码,并且在尝试在不同页面上抓取不同的表格。
例如在此页面上,例如:http://www.tennisabstract.com/cgi-bin/player.cgi?p=NovakDjokovic,我可以轻松地“检查元素”,然后转到Network
,找到脚本的正确“名称”,然后找到我需要获取的请求URL我想要的桌子。我用于此的代码是:
url = 'http://www.minorleaguesplits.com/tennisabstract/cgi-bin/frags/NovakDjokovic.js'
content = requests.get(url)
soup = BeautifulSoup(content.text, 'html.parser')
table = soup.find('table', id='tour-years', attrs= {'class':'tablesorter'})
dfs = pd.read_html(str(table))
df = pd.concat(dfs)
但是,现在当我在同一个站点上浏览另一个页面时,说这个http://www.tennisabstract.com/charting/20190714-M-Wimbledon-F-Roger_Federer-Novak_Djokovic.html,我无法找到请求URL,该请求URL最终将使我能够获得想要的表。我重复与上面相同的过程,但是在具有该表的“网络”选项卡下没有.js
脚本。在查看html元素时,我确实看到了该表,但是,如果没有正确的url,我当然无法得到它。
所以我的问题是,如何从此页面http://www.tennisabstract.com/charting/20190714-M-Wimbledon-F-Roger_Federer-Novak_Djokovic.html中获取表格?
TIA!
答案 0 :(得分:1)
在查看html页面的源代码时,您可以看到所有数据已经加载到script标记中。您唯一需要做的就是提取变量值并将其加载到beautifulsoup。
以下代码提供了脚本标记中的所有变量和值
import requests, re
from bs4 import BeautifulSoup
res = requests.get("http://www.tennisabstract.com/charting/20190714-M-Wimbledon-F-Roger_Federer-Novak_Djokovic.html")
soup = BeautifulSoup(res.text, "lxml")
script = soup.find("script", attrs={"language":"JavaScript"}).text
var_only = script[:script.index("$(document)")].strip()
接下来,您可以使用正则表达式获取变量值-https://regex101.com/r/7cE85A/1