Python 3.x 如何在Python中使用BeautifulSoup从HTML链接解析嵌套表?

Python 3.x 如何在Python中使用BeautifulSoup从HTML链接解析嵌套表?,python-3.x,pandas,beautifulsoup,html-parsing,html-parser,Python 3.x,Pandas,Beautifulsoup,Html Parsing,Html Parser,全部, 我正试图从这个链接解析表。 请注意:要在“学校/体育搜索”下进行搜索,请为学校选择全部,2005-2006年,体育-足球,第一组。我试图解析的列是学校名称,如果单击学校名称。将输出更多信息。从这个链接/表格中,我想解析每个学校的“体育场容量”。我的问题是这样的事情可能吗?如果是,如何进行?我是python和BeautifulSoup的新手,如果你能提供解释,那就太好了 注:共有239个结果 总而言之:所以基本上我想解析学校名称以及它们的体育场容量,并将其转换为熊猫数据帧 import r

全部,

我正试图从这个链接解析表。 请注意:要在“学校/体育搜索”下进行搜索,请为学校选择全部,2005-2006年,体育-足球,第一组。我试图解析的列是学校名称,如果单击学校名称。将输出更多信息。从这个链接/表格中,我想解析每个学校的“体育场容量”。我的问题是这样的事情可能吗?如果是,如何进行?我是python和BeautifulSoup的新手,如果你能提供解释,那就太好了

注:共有239个结果

总而言之:所以基本上我想解析学校名称以及它们的体育场容量,并将其转换为熊猫数据帧

import requests 
from bs4 import BeautifulSoup
URL = "http://web1.ncaa.org/stats/StatsSrv/careerteam"
r = requests.get(URL) 

soup = BeautifulSoup(r.content, 'html5lib') 
print(soup.prettify()) 
我的问题是这样的事情可能吗

如果是,如何进行

下面的代码中有很多内容。但主要的一点是找出浏览器发出的post请求,然后使用请求模拟这些请求。我们可以通过inspect工具中的“network”(网络)选项卡找到请求

首先,我们提出“搜索”帖子请求。这提供了一个左右表。点击左表,我们可以看到该地区的学校。但是如果我们仔细观察,点击区域链接也是一个post请求(我们必须使用请求)

点击“空军-东部伊利诺伊州”,我们会看到一个包含该地区学校链接的表格。然后我们必须去学校的链接,计算出容量

因为点击每个学校链接也是一个post请求,我们必须模拟,这将返回学校页面。从这里我们取消学校名称和容量

您可以通过阅读了解会话对象,了解如何使用请求发出请求

import requests
from bs4 import BeautifulSoup
import pandas as pd
end_list=[]
s = requests.Session()
URL = "http://web1.ncaa.org/stats/StatsSrv/careersearch"
data={'doWhat': 'teamSearch','searchOrg': 'X', 'academicYear': 2006, 'searchSport':'MFB','searchDiv': 1}
r = s.post(URL,data=data)
soup=BeautifulSoup(r.text,'html.parser')
area_list=soup.find_all('table')[8].find_all('tr')
area_count=len(area_list)#has no of areas + 1  tr 'Total Results of Search:  239'
for idx in range(0,area_count):
    data={
    'sortOn': 0,
    'doWhat': 'showIdx',
    'playerId':'' ,'coachId': '',
    'orgId':'' ,
    'academicYear':'' ,
    'division':'' ,
    'sportCode':'' ,
    'idx': idx
    }
    r = s.post(URL,data=data)
    soup=BeautifulSoup(r.text,'html.parser')
    last_table=soup.find_all('table')[-1]#last table
    for tr in last_table.find_all('tr'):
        link_td=tr.find('td',class_="text")
        try:
            link_a=link_td.find('a')['href']
            data_params=link_a.split('(')[1][:-2].split(',')
            try:
                #print(data_params)
                sports_code=data_params[2].replace("'","").strip()
                division=int(data_params[3])
                player_coach_id=int(data_params[0])
                academic_year=int(data_params[1])
                org_id=int(data_params[4])
                #print(sports_code,division,player_coach_id,academic_year,org_id)
                data={
                'sortOn': 0,
                'doWhat': 'display',
                'playerId': player_coach_id,
                'coachId': player_coach_id,
                'orgId': org_id,
                'academicYear': academic_year,
                'division':division,
                'sportCode':sports_code,
                'idx':''
                }
                url='http://web1.ncaa.org/stats/StatsSrv/careerteam'
                r = s.post(url,data=data)
                soup2=BeautifulSoup(r.text,'html.parser')
                institution_name=soup2.find_all('table')[1].find_all('tr')[2].find_all('td')[1].text.strip()
                capacity=soup2.find_all('table')[4].find_all('tr')[2].find_all('td')[1].text.strip()
                #print([institution_name, capacity])
                end_list.append([institution_name, capacity])

            except IndexError:
                pass

        except AttributeError:
            pass
#print(end_list)
headers=['School','Capacity']
df=pd.DataFrame(end_list, columns=headers)
print(df)
输出

                School Capacity
0            Air Force   46,692
1                Akron   30,000
2              Alabama  101,821
3         Alabama A&M;   21,000
4          Alabama St.   26,500
5          Albany (NY)    8,500
6               Alcorn   22,500
7      Appalachian St.   30,000
8              Arizona   55,675
9          Arizona St.   64,248
10     Ark.-Pine Bluff   14,500
11            Arkansas   72,000
12        Arkansas St.   30,708
13     Army West Point   38,000
14              Auburn   87,451
15         Austin Peay   10,000
16                 BYU   63,470
17            Ball St.   22,500
18              Baylor   45,140
19     Bethune-Cookman    9,601
20           Boise St.   36,387
21      Boston College   44,500
22       Bowling Green   24,000
23               Brown   20,000
24            Bucknell   13,100
25             Buffalo   29,013
26              Butler    5,647
27            Cal Poly   11,075
28          California   62,467
29   Central Conn. St.    5,500
..                 ...      ...
209               UCLA   91,136
210              UConn   40,000
211                UNI   16,324
212               UNLV   36,800
213          UT Martin    7,500
214               UTEP   52,000
215               Utah   45,807
216           Utah St.   25,100
217                VMI   10,000
218         Valparaiso    5,000
219         Vanderbilt   40,350
220          Villanova   12,000
221           Virginia   61,500
222      Virginia Tech   65,632
223             Wagner    3,300
224        Wake Forest   31,500
225         Washington   70,138
226     Washington St.   32,740
227          Weber St.   17,500
228      West Virginia   60,000
229      Western Caro.   13,742
230       Western Ill.   16,368
231        Western Ky.   22,113
232      Western Mich.   30,200
233     William & Mary   12,400
234          Wisconsin   80,321
235            Wofford   13,000
236            Wyoming   29,181
237               Yale   64,269
238     Youngstown St.   20,630

[239 rows x 2 columns]
注:
这需要很长时间。我们正在删除超过239页的内容。所以要有耐心。可能需要15分钟或更长时间。

您是否可以解决此查询:我无法在网络数据下找到此查询的参数query@Data_is_Power我试试看。我现在不在家。我会尽快告诉你的。太好了。再次非常感谢!:)