使用名称从网站中删除数据表

问题描述 投票:4回答:1

我尝试抓取网站时遇到的情况很特殊。我正在通过搜索栏搜索数百个名称,然后抓取表格。但是,某些名称是唯一的,与网站上的名称相比,在我的列表中的拼写有所不同。在这种情况下,我会在网站上手动查找几个名称,但仍然直接将我带到单个页面。其他时候,如果有多个具有相同或相似名称的人(在这种情况下,我想要在NBA中踢球的人),则转到名称列表中。我已经考虑了这一点,但是我认为有必要提一下)。我该如何继续进入那些玩家的个人页面,而不必每次都运行脚本并点击错误以查看哪个玩家的拼写稍有不同?同样,即使拼写略有不同或姓名列表(在NBA中也需要),数组中的姓名也会直接将您带到单独的页面。一些示例包括Georgios Papagiannis(在网站上列为George Papagiannis),Ognjen Kuzmic(列为Ognen Kuzmic),Nene(列为Maybyner Nene,但将带您列出名称-https://basketball.realgm.com/search?q=nene)。这似乎很难,但是我觉得这可能。同样,每次将其与下一个播放器一起覆盖时,似乎没有将所有抓取的数据写入到csv中。多谢。

我得到的错误:AttributeError: 'NoneType' object has no attribute 'text'

import requests
from bs4 import BeautifulSoup
import pandas as pd


playernames=['Carlos Delfino', 'Nene', 'Yao Ming', 'Marcus Vinicius', 'Raul Neto', 'Timothe Luwawu-Cabarrot']

result = pd.DataFrame()
for name in playernames:

    fname=name.split(" ")[0]
    lname=name.split(" ")[1]
    url="https://basketball.realgm.com/search?q={}+{}".format(fname,lname)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    if soup.find('a',text=name).text==name:
        url="https://basketball.realgm.com"+soup.find('a',text=name)['href']
        print(url)
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'lxml')

    try:
        table1 = soup.find('h2',text='International Regular Season Stats - Per Game').findNext('table')
        table2 = soup.find('h2',text='International Regular Season Stats - Advanced Stats').findNext('table')

        df1 = pd.read_html(str(table1))[0]
        df2 = pd.read_html(str(table2))[0]

        commonCols = list(set(df1.columns) & set(df2.columns))
        df = df1.merge(df2, how='left', on=commonCols)
        df['Player'] = name
        print(df)
    except:
        print ('No international table for %s.' %name)
        df = pd.DataFrame([name], columns=['Player'])

result = result.append(df, sort=False).reset_index(drop=True)

cols = list(result.columns)
cols = [cols[-1]] + cols[:-1]
result = result[cols]
result.to_csv('international players.csv', index=False)
python pandas web-scraping beautifulsoup
1个回答
1
投票

我为名字相似的NBA球员使用循环。您可以在下面的CSS选择器下面找到,以从搜索表中获取NBA球员:

.tablesaw tr:has(a[href*="/nba/teams/"]) a[href*="/player/"]

CSS选择器含义:按tablesaw类查找表,查找表的子级tr,其子级ahref包含/nba/teams/文本,然后找到其ahref包含[ C0]

我添加了搜索播放器名称真实播放器名称列,您可以看到如何找到播放器。此列使用/player/放置为第一和第二列(请参见代码中的注释)。

insert
© www.soinside.com 2019 - 2024. All rights reserved.