2017-02-17 38 views
1

我抓到了這個頁面https://www.capfriendly.com/teams/bruins,特別是在Cap Cap(Fowards,Defense,GoalTenders)標籤下尋找表格。當我刮表時,如何避免來自不同選項卡的數據在一個單元格中串聯?

我用Python和BeautifulSoup4和CSV作爲輸出格式。

import requests, bs4 

r = requests.get('https://www.capfriendly.com/teams/bruins') 
soup = bs4.BeautifulSoup(r.text, 'lxml') 
table = soup.find(id="team") 

with open("csvfile.csv", "w", newline='') as team_data: 
    for tr in table('tr', class_=['odd', 'even']): # get all tr whose class is odd or even 
     row = [td.text for td in tr('td')] # extract td's text 
     writer = csv.writer(team_data) 
     writer.writerow(row) 

這是輸出,我得到:

['Krejci, David "A"', 'NMC', 'C', 'NHL', '30', '$7,250,000$7,250,000NMC', '$7,250,000$7,500,000NMC', '$7,250,000$7,500,000NMC', '$7,250,000$7,000,000Modified NTC', '$7,250,000$7,000,000Modified NTC', 'UFA', ''] 
['Bergeron, Patrice "A"', 'NMC', 'C', 'NHL', '31', '$6,875,000$8,750,000NMC', '$6,875,000$8,750,000NMC', '$6,875,000$6,875,000$6,000,000NMC', '$6,875,000$4,375,000$3,500,000NMC', '$6,875,000$4,375,000$1,000,000Modified NTC, NMC', '$6,875,000$4,375,000$1,000,000Modified NTC, NMC', 'UFA'] 
['Backes, David', 'NMC', 'C, RW', 'NHL', '32', '$6,000,000$8,000,000$3,000,000NMC', '$6,000,000$8,000,000$3,000,000NMC', '$6,000,000$6,000,000$3,000,000NMC', '$6,000,000$4,000,000$3,000,000Modified NTC', '$6,000,000$4,000,000$1,000,000Modified NTC', 'UFA', ''] 
['Marchand, Brad', 'M-NTC', 'LW', 'NHL', '28', '$4,500,000$5,000,000Modified NTC', '$6,125,000$8,000,000$4,000,000NMC', '$6,125,000$8,000,000$3,000,000NMC', '$6,125,000$7,500,000$4,000,000NMC', '$6,125,000$5,000,000$1,000,000NMC', '$6,125,000$6,500,000$4,000,000NMC', '$6,125,000$5,000,000$3,000,000Modified NTC'] 

正如你可以看到不同的選項卡數據連接到一起:

'$7,250,000$7,000,000Modified NTC' 

有人建議我使用JavaScript來刮表,它應該解決我的問題?

+0

'它應該解決我的問題' - 問題是什麼? –

+0

我更新了問題以回答您的問題 – user3768804

回答

0

根據源代碼,這是特定行中的一些文本,根據您所在的標籤(如標題狀態),這些文本是有條件可見的。當想要在該特定選項卡上隱藏時,類.hide被添加到td中的子元素。

當您解析td元素來檢索文本時,可以過濾出那些假設隱藏的元素。這樣做時,您可以檢索可以看到的文本,就像在Web瀏覽器中查看頁面一樣。

在下面的代碼片段中,我添加了一個parse_td函數,該函數可以篩選出hide類別的子元素span。從那裏,返回相應的文本。

import requests, bs4, csv 

r = requests.get('https://www.capfriendly.com/teams/bruins') 
soup = bs4.BeautifulSoup(r.text, 'lxml') 
table = soup.find(id="team") 

with open("csvfile.csv", "w", newline='') as team_data: 
    def parse_td(td): 
     filtered_data = [tag.text for tag in td.find_all('span', recursive=False) 
         if 'hide' not in tag.attrs['class']] 
     return filtered_data[0] if filtered_data else td.text; 

    for tr in table('tr', class_=['odd', 'even']): 
     row = [parse_td(td) for td in tr('td')] 
     writer = csv.writer(team_data) 
     writer.writerow(row) 
相關問題