2017-08-12 58 views
2

我是新來的Python和捆綁使用刮從這個URL表BeautifulSoup: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=網頁抓取兩個HTML文本和圖像鏈接使用Python Beautifulsoup

到目前爲止,我已經找到了如何拉表每個玩家行的數據,以及每行中學校徽標的鏈接。但是,我無法將這兩者結合起來。我想爲每個球員(下面代碼中的player_data)以及他們相應的學校徽標圖片鏈接(logo_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) 
+0

是'list(zip(player_data,logo_links))'你在這裏想要什麼? –

+0

@ViníciusAguiar很好地排列了兩個列表,但我希望'logo_links'成爲'player_data'列表的一部分。按照您的建議壓縮列表後,當我將其導出爲CSV時,所有'player_data'都在一列中,然後'logo_links'在第二列中:https://d1ax1i5f2y3x71.cloudfront.net/items/2817413i333G1A3k1N44/Image% 202017-08-12%20AT%203.18.15%20 PM.png?X-CloudApp-訪客-ID = 2746470。我的理想輸出是一個CSV,其中一列與每個現有表格的列匹配。 – NateRattner

回答

3

我會做這樣的事情。
原因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塊看起來爲divHTML具有所需的類名的
主要是,我沒有使用列表理解,如果這樣做,其追加到列表它在tr標記中收集的數據。

2

logo_links元素附加到每個列表裏面player_data你可以做這樣的事情:

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

這很棒!謝謝。在我學習的時候,你有什麼機會可以解釋爲什麼這會起作用?主要是,這裏有什麼'p'? – NateRattner

+1

我很樂意幫忙!在Python中,您可以執行'for'循環遍歷任何* iterable *的元素,例如列表或字符串。然後將序列中的第一個項目(在本例中爲'player_data')分配給您的變量(在本例中爲'p'),並且每次循環時都會分配給下一個值。嘗試在循環內寫入'print(p)',你會看到更好的結果。 [這裏](https://www.tutorialspoint.com/python/python_for_loop.htm)是一個很好的參考資料。 –

+1

這很有道理。非常感謝。 – NateRattner