【问题标题】:Extracting the required information for a Script tag of scraped webpage using BeautifulSoup使用 BeautifulSoup 为抓取的网页的 Script 标签提取所需信息
【发布时间】:2021-10-07 03:56:28
【问题描述】:

我是一个网络抓取新手,我正在寻找下一步该做什么的指示,或者可能是一个可行的解决方案,以抓取以下网页:https://www.capology.com/club/leicester/salaries/2019-2020/

我想为表格的每一行(玩家)提取以下内容:

  • 玩家姓名,即 Jamie Vardy
  • 每周总基本工资(以英镑计),即 140,000 英镑
  • 年度基本工资总额(以英镑计),即 7,280,000 英镑
  • 位置即F
  • 年龄即 33 岁
  • 国家英格兰

以下代码为我想要的 JavaScript 信息表创建“汤”:

import requests
from bs4 import BeautifulSoup
import json

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'}

url = 'https://www.capology.com/club/leicester/salaries/2019-2020/'

r = requests.get(url)

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

script = soup.find_all('script')[11].string    # 11th script tag in the webpage

我可以看到分配给 script 变量的“汤”包含我需要的所有信息,但是,我正在努力提取作为 pandas DataFrame 所需的信息?

我随后想将此设置为分页,以在 17-18 的“五强”欧洲联赛(英超、意甲、西甲、德甲和法甲)中搜索每支球队、18-19、19-20 和 20-21(当前)季节。但是,这是最后阶段的解决方案,如果这是一个耗时的请求,我很乐意离开并尝试自己做。

一个可行的解决方案会很棒,但只是一些提示,这样我就可以离开并尽可能高效地自己学习这些东西。

非常感谢!

【问题讨论】:

    标签: python pandas selenium web-scraping beautifulsoup


    【解决方案1】:

    这是最适合selenium 之类的工具的任务,因为该站点在加载后使用脚本在页面中填充表格,并且解析来自script 的值并非易事来源:

    from selenium import webdriver
    from bs4 import BeautifulSoup as soup
    import urllib.parse, collections, re
    d = webdriver.Chrome('/path/to/chromedriver')
    d.get((url:='https://www.capology.com/club/leicester/salaries/2019-2020/'))
    league_teams = d.execute_script("""
        var results = [];
        for (var i of Array.from(document.querySelectorAll('li.green-subheader + li')).slice(0, 5)){
            results.push({league:i.querySelector('.league-title').textContent, 
            teams:Array.from(i.querySelectorAll('select:nth-of-type(1).team-menu option')).map(x => [x.getAttribute('value'), x.textContent]).slice(1), 
            years:Array.from(i.querySelectorAll('select:nth-of-type(2).team-menu option')).map(x => [x.getAttribute('value'), x.textContent]).slice(2)})
        }
        return results;
    """)
    vals = collections.defaultdict(dict)
    for i in league_teams:
       for y, full_year in [[re.sub('\d{4}\-\d{4}', '2020-2021', i['years'][0][0]), '2020-21'], *i['years']][:4]:
          for t, team in i['teams']:
              d.get(urllib.parse.urljoin(url, t) + (y1:=re.findall('/\d{4}\-\d{4}/', y)[0][1:]))
              hvals = [x.get_text(strip=True) for x in soup(d.page_source, 'html.parser').select('#table thead tr:nth-of-type(3) th')]
              tvals = soup(d.page_source, 'html.parser').select('#table tbody tr')
              full_table = [dict(zip(hvals, [j.get_text(strip=True) for j in k.select('td')])) for k in tvals]
              if team not in vals[i['league']]:
                 vals[i['league']][team] = {full_year:None}
              vals[i['league']][team][full_year] = full_table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2012-05-18
      • 2020-04-05
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2018-08-12
      相关资源
      最近更新 更多