如何使用“美丽汤”解析面糊的名称?

时间:2018-09-19 01:27:01

标签: python selenium parsing beautifulsoup python-requests

我没有任何问题可以掌握三个统计数据:命中率,奔跑次数和rbi。到目前为止,这是我一直在使用的代码:

#import modules

from bs4 import BeautifulSoup
import requests, os
from selenium import webdriver

#start webdriver 

os.chdir('C:\webdrivers')
header = {'User-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
options = webdriver.ChromeOptions(); options.add_argument("--start- 
maximized")
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://www.baseball-reference.com/leagues/MLB/2018-standard- 
batting.shtml')

#grab html

soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()

#parse three stats: rbi's, runs and hits

hits = [i.text for i in soup.find_all('td', {'data-stat': 'H'})]
runs = [i.text for i in soup.find_all('td', {'data-stat': 'R'})]
rbi = [i.text for i in soup.find_all('td', {'data-stat': 'RBI'})]

#print data

print(hits, runs, rbi)

上面的代码效果很好。但是,当我尝试获取击球员的名字时,我遇到了一些问题。击球员的名字没有正确解析。如果可能的话,我只想要他们的名字和姓氏。

这是我尝试过的:

print(soup.find_all('td', {'data-stat': 'player'}))

击球手的名字在代码中,但是有很多额外的数据。另外,当我尝试使用这行代码时,我的计算机的运行速度也大大降低。有什么建议么?预先感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:0)

如何获取击球员的名字:

直接请求播放器数据,当我看着页面加载时我找到了这个网址,从这个网址获取播放器名称非常容易:
https://d3k2oh6evki4b7.cloudfront.net/short/inc/players_search_list.csv

如何加快代码速度:

首先:使用selenium加载网络驱动程序将在代码中花费大部分时间。 对于抓取目标,建议您直接使用requests代替selenium

第二::lxml解析器将比html解析器更快,但是如果您从不使用它,则应该安装它,只需运行“ pip install lxml”将对您有所帮助。
installing-a-parser and summarizes the advantages and disadvantages of each parser library

例如:

import requests
from bs4 import BeautifulSoup

# start requests
target_url = 'https://www.baseball-reference.com/leagues/MLB/2018-standard-batting.shtml'
headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}

page_source = requests.get(target_url, headers=headers).text

#grab html

soup = BeautifulSoup(page_source, 'lxml')

#parse three stats: rbi's, runs and hits

hits = [i.text for i in soup.find_all('td', {'data-stat': 'H'})]
runs = [i.text for i in soup.find_all('td', {'data-stat': 'R'})]
rbi = [i.text for i in soup.find_all('td', {'data-stat': 'RBI'})]

#print data

print(hits, runs, rbi)

答案 1 :(得分:0)

数据不在源页面中,请参考此链接: https://d3k2oh6evki4b7.cloudfront.net/short/inc/players_search_list.csv

这是csv文件,您可以直接下载该文件,也可以使用代码获取所需的数据。