从Python中的列表中提取数据,在BeautifulSoup scrape之后,并创建Pandas表

2024-04-24 09:45:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我学习Python的基础知识已经有一段时间了,我想我应该继续努力,试着把一些东西放在一起,但似乎遇到了一个绊脚石(尽管我到处寻找,看看哪里可能出错)

我想从这里抢一张桌子:https://www.oddschecker.com/horse-racing/2020-09-10-chelmsford-city/20:30/winner

现在我意识到,这个表并没有列出一个普通HTML的典型情况,因此,试图用Pandas来获取它不会产生结果。因此,我们深入研究了BeautifulSoup,试图获得一个结果

似乎我需要的所有数据都在类“diff row evTabRow bc”中,因此我编写了以下代码:

url = requests.get('https://www.oddschecker.com/horse-racing/2020-09-10-haydock/14:00/winner')
soup = BeautifulSoup(url.content, 'lxml')
table = soup.find_all("tr", class_="diff-row evTabRow bc")

这似乎把每匹马和我需要的所有相应数据都放到了一个列表中。在这个列表中,我只需要某些位,即马名的“数据名”和当前赔率的“数据odig”

我想可能有某种方法可以从列表中提取数据来构建列表列表,然后在Pandas中构建数据帧,但我可能在这方面做得完全错误


Tags: 数据httpscompandas列表wwwdiffrow
3条回答

您要查找的数据都在行标记中<;tr>;在单元格标签中<;td>

问题在于,并非所有<;td>;'s是有用的,所以你必须跳过这些

import pandas as pd

from bs4 import BeautifulSoup
import requests

url   = requests.get('https://www.oddschecker.com/horse-racing/thirsk/13:00/winner')
soup  = BeautifulSoup(url.content, 'lxml')
rows = soup.find_all("tr", class_="diff-row evTabRow bc")

my_data = []
for row in rows:
    horse = row.attrs['data-bname']

    for td in row:
        if td.attrs['class'][0] != 'np':
            continue #Skip

        bookie = td['data-bk']
        odds   = td['data-odig']
        my_data.append(dict(
            horse  = horse,
            bookie = bookie,
            odds   = odds
        ))

df = pd.DataFrame(my_data)
print(df)

这将为您提供您想要的:

          horse bookie  odds
0    Just Frank     B3  3.75
1    Just Frank     SK  4.33
2    Just Frank     WH  4.33
3    Just Frank     EE  4.33
4    Just Frank     FB   4.2
..          ...    ...   ...
268     Tommy R     RZ    29
269     Tommy R     SX    26
270     Tommy R     BF  10.8
271     Tommy R     MK    41
272     Tommy R     MA    98

[273 rows x 3 columns]

如果是网页抓取,您可以采用将数据存储为各种变量的方法:

l = []
for thing in elements:
    var1 = ...  # however you extract it
    var2 = ...

    l.append({'column1_name': var1, 'column2_name': var2})

df = pd.DataFrame(l)

如何从HTML元素中选择数据取决于您(考虑选择td

您可以使用BeautifulSoup对象^{}属性访问任何<tr>属性

一旦你有了table,在每个条目上循环,取出你想要的属性作为一个dict列表。然后使用结果列表初始化数据帧

horse_attrs = list()

for entry in table:
    attrs = dict(name=entry.attrs['data-bname'], dig=entry.attrs['data-best-dig'])
    horse_attrs.append(attrs)

df = pd.DataFrame(horse_attrs)

df
                name   dig
0         Las Farras  9999
1         Heat Miami  9999
2        Martin Beck  9999
3             Litran  9999
4      Ritmo Capanga  9999
5      Perfect Score  9999
6   Simplemente Tuyo  9999
7            Anpacai  9999
8          Colt Fast  9999
9         Cacharpari  9999
10        Don Leparc  9999
11   Curioso Seattle  9999
12       Golpe Final  9999
13       El Acosador  9999

注:

  • 您提供的url对我不起作用,但这个类似的url确实起作用:https://www.oddschecker.com/horse-racing/palermo-arg/21:00/winner
  • 我没有看到您提到的确切属性(data-namedata-odig),所以我使用了具有类似名称的属性。我对赛马知之甚少,不知道这些是否有用,但这个答案中的方法应该允许您选择任何可用的属性

相关问题 更多 >