我正在尝试刮掉棒球阵容数据但只想返回球员名字。但是,截至目前,它正在给我 - 位置,换行符,姓名,换行符,然后是击球方。比如我想要的
'D. Fletcher'
但我得到了
'LF\nD. Fletcher\nR'
此外,它给了我页面上的所有玩家。我最好按团队对它们进行分组,这可能需要某种字典设置但不确定代码是什么样的。
我尝试过使用strip
函数,但我相信只会删除前导或尾随问题,而不是中间。我已经尝试过研究如何从锚标记中获取标题信息,但还没有弄清楚如何做到这一点。
from bs4 import BeautifulSoup
import requests
url = 'https://www.rotowire.com/baseball/daily_lineups.htm'
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")
players = soup.find_all('li', {'class': 'lineup__player'})
####for link in players.find('a'):
##### print (link.string)
awayPlayers = [player.text.strip() for player in players]
print(awayPlayers)
你应该只获得.text
标签的a
,而不是整个li
:
awayPlayers = [player.find('a').text.strip() for player in players]
这将导致类似以下内容:
['L. Martin', 'Jose Ramirez', 'J. Luplow', 'C. Santana', ...
假设你想用团队名称和玩家建立那个dict,你可以做如下的事情。我不知道你是否想要突出显示的玩家,例如特雷弗鲍尔?我已经添加了变量来保存它们以备不时之需。
广告框和工具框通过以下方式排除:非伪类,它传递要忽略的类列表。
from bs4 import BeautifulSoup as bs
import requests
r = requests.get('https://www.rotowire.com/baseball/daily-lineups.php')
soup = bs(r.content, 'lxml')
team_dict = {}
teams = [item.text for item in soup.select('.lineup__abbr')] #26
matches = {}
i = 0
for teambox in soup.select('.lineups > div:not(.is-ad, .is-tools)'):
team_visit = teams[i]
team_home = teams[i + 1]
highlights = teambox.select('.lineup__player-highlight-name a')
visit_highlight = highlights[0].text
home_highlight = highlights[1].text
match = team_visit + ' v ' + team_home
visitors = [item['title'] for item in teambox.select('.is-visit .lineup__player [title]')]
home = [item['title'] for item in teambox.select('.is-home .lineup__player [title]')]
matches[match] = {'visitor' : [{team_visit : visitors}] ,
'home' : [{team_home : home}]
}
i+=1
示例信息:
目前的结构:
我觉得你几乎就在那里,你只需稍微调整一下:
awayPlayers = [player.find('a').text for player in players]
这个列表理解只会从列表中获取名称,然后从锚点中提取文本...您只需获取一个名称列表:
['L. Martin',
'Jose Ramirez',
'J. Luplow'...]
你必须在其中找到a
标签和title
属性,请查看以下答案。
awayPlayers = [player.find('a').get('title') for player in players]
print(awayPlayers)
输出是:
['Leonys Martin', 'Jose Ramirez', 'Jordan Luplow', 'Carlos Santana',