使用Python Beautifulsoup进行网页抓取html文本和图像链接

使用Python Beautifulsoup进行网页抓取html文本和图像链接,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我是Python新手,打算使用BeautifulSoup从这个URL中删除表: 到目前为止,我已经找到了如何提取每个玩家行的表数据,以及每行中指向学校徽标的链接。然而,我很难将两者结合起来。我想将每个播放器的表数据(下面代码中的player\u data)以及相应的学校徽标图像链接(logo\u links)拉入保存的CSV中每个播放器的一行 以下是我到目前为止的情况。提前谢谢你的帮助 #! python3 # downloadRecruits.py - Downloads espn colle

我是Python新手,打算使用BeautifulSoup从这个URL中删除表:

到目前为止,我已经找到了如何提取每个玩家行的表数据,以及每行中指向学校徽标的链接。然而,我很难将两者结合起来。我想将每个播放器的表数据(下面代码中的
player\u data
)以及相应的学校徽标图像链接(
logo\u links
)拉入保存的CSV中每个播放器的一行

以下是我到目前为止的情况。提前谢谢你的帮助

#! python3
# downloadRecruits.py - Downloads espn college basketball recruiting database info

import requests, os, bs4, csv
import pandas as pd

# Starting url (class of 2007)
url = 'http://www.espn.com/college-sports/basketball/recruiting/databaseresults?firstname=&lastname=&class=2007&starsfilter=GT&stars=0&ratingfilter=GT&rating=&positionrank=&sportid=4294967265&collegeid=&conference=&visitmonth=&visityear=&statuscommit=Commitments&statusuncommit=Uncommited&honor=&region=&state=&height=&weight='


# Download the page
print('Downloading page %s...' % url)
res = requests.get(url)
res.raise_for_status()

# Creating bs object
soup = bs4.BeautifulSoup(res.text, "html.parser")

# Get the data
data_rows = soup.findAll('tr')[1:]
type(data_rows)

player_data = [[td.getText() for td in data_rows[i].findAll('td')] for i in range(len(data_rows))]

logo_links = [a['href'] for div in soup.find_all("div", attrs={"class": "school-logo"}) for a in div.find_all('a')]


# Saving only player_data
with open('recruits2.csv', 'w') as f_output:
   csv_output = csv.writer(f_output)
   csv_output.writerows(player_data)

要将
logo\u链接
元素附加到
player\u数据
中的每个列表,可以执行以下操作:

>>> i = 0
>>> for p in player_data:
    p.append(logo_links[i])
    i+=1

我会这样做。
理由1:您不必在HTML中查找两次您的内容。
原因2:遵循原因1,您不必再次运行循环

player_data = []
for tr in data_rows:
    tdata = []
    for td in tr:
        tdata.append(td.getText())

        if td.div and td.div['class'][0] == 'school-logo':
            tdata.append(td.div.a['href'])

    player_data.append(tdata)
小说明-

主要是,我没有使用列表理解,因为
if
块在
HTML
中查找
div
块,该块具有所需的类名,如果有,它会附加到它在
tr
标记中收集的数据列表中。

list(zip(player\u data,logo\u links))
你想在这里做什么?@ViníciusAguiar很好地排列了两个列表,但我希望
徽标链接
成为
玩家数据的同一列表的一部分。当我按照您的建议压缩列表后导出到CSV时,所有
player\u数据
都在一列中,然后
logo\u链接
在第二列中:。我的理想输出是一个CSV,其中一列与现有表的每一列匹配。这非常有效!非常感谢。据我所知,你有没有可能解释一下为什么会这样?主要是,这里的
p
是什么?我很乐意帮忙!在Python中,您可以执行
for
循环来迭代任何iterable的元素,例如列表或字符串。序列中的第一项(在本例中为
player\u data
)随后被分配给变量(在本例中为
p
),每次循环时,它都将分配给下一个值。试着在循环中写入
print(p)
,你会更好地看到它是如何运行的。这是一个很好的参考。这是有道理的。非常感谢。