2017-02-17 19 views
1

Я соскоблил эту страницу https://www.capfriendly.com/teams/bruins, специально ища таблицы под вкладкой Cap Hit (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, чтобы восстановить текст, вы можете отфильтровывать те элементы, которые предположительно должны быть скрыты. При этом вы можете получить текст, который будет отображаться, как если бы вы просматривали страницу в веб-браузере.

В отрывке ниже я добавил функцию parse_td, которая отфильтровывает дочерние элементы span с классом hide. Оттуда возвращается соответствующий текст.

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)