如何使用BeautifulSoup刮取“单击以显示”字段

时间:2016-10-05 00:16:51

标签: python html web-scraping beautifulsoup

我正在努力削减篮球运动员从verbalcommits.com获得优惠的学校和学校名称

以此页面为例:http://www.verbalcommits.com/players/jarrey-foster

很容易访问第一个优惠(SMU),但所有其他优惠都隐藏在“显示其他优惠”按钮后面。当我检查页面时,我可以看到要约,但我的刮刀没有找到它们。我一直在使用以下内容:

page=urllib.request.urlopen("http://www.verbalcommits.com/players/jarrey-foster") #opens page    
soup = BeautifulSoup(page, 'html.parser') #makes page into a BS python object
schools = soup.body.findAll('span',{"class":"team_name"})
print(schools)

这将返回其中包含团队名称的第一个跨度,但不会返回隐藏的其余跨度。我需要添加什么才能访问隐藏的其余页面?

2 个答案:

答案 0 :(得分:2)

详细说明@furas's great answer。以下是如何提取玩家ID并发出第二个请求以获得"已关闭的优惠"。为此,我们将使用requests维护网络抓取会话:

import requests
from bs4 import BeautifulSoup


with requests.Session() as session:
    response = session.get("http://www.verbalcommits.com/players/jarrey-foster")

    # get the player id
    soup = BeautifulSoup(response.content, "html.parser")
    player_id = soup.select_one("h1.player-name").get("data-player-id")

    # get closed offers
    response = session.get("http://www.verbalcommits.com/player_divs/closed_offers", params={"player_id": player_id})

    soup = BeautifulSoup(response.content, "html.parser")

    # print team names
    for team in soup.select(".team_name"):
        print(team.get_text())

打印团队名称以进行演示:

UTEP
Sam Houston State
New Hampshire
Rice
Temple
Liberty
UL Lafayette

答案 1 :(得分:1)

您无法获取其他数据,因为当您单击按钮时,JavaScript会从服务器中读取

http://www.verbalcommits.com/player_divs/closed_offers?player_id=17766&_=1475626846752

现在您可以将此URL与BS一起使用来获取数据。

我在Firefox中使用Firebug或在Chrome中使用Developer Tools来查找此网址。

HTML中的

编辑:我发现data-player-id="17766" - 这是上面网址中的第一个参数。也许你可以找到第二个参数,这样你就可以使用Python生成url。

编辑:我查了网址

http://www.verbalcommits.com/player_divs/closed_offers?player_id=17766

并且它提供相同的数据,因此您不需要第二个参数。