2017-07-06 7 views
0

In meinem vorherigen Beitrag möchte ich einige Pferderennen Daten auf HKJC kratzen. Dank der Hilfe von Dmitriy Fialkovskiy habe ich es geschafft, den gegebenen Code leicht zu modifizieren. Allerdings, wenn ich die Logik hinter zu verstehen versuchte, war es eine Linie nicht erklärt werden konnte:Web Scraping von Beautifulsoup

from bs4 import BeautifulSoup as BS 
import requests 
import pandas as pd 

url_list = ['http://www.hkjc.com/english/racing/horse.asp?HorseNo=S217','http://www.hkjc.com/english/racing/horse.asp?HorseNo=A093','http://www.hkjc.com/english/racing/horse.asp?HorseNo=V344','http://www.hkjc.com/english/racing/horse.asp?HorseNo=V077', 'http://www.hkjc.com/english/racing/horse.asp?HorseNo=P361', 'http://www.hkjc.com/english/racing/horse.asp?HorseNo=T103'] 


res=[] #placing res outside of loop 
for link in url_list: 
    r = requests.get(link) 
    r.encoding = 'utf-8' 

    html_content = r.text 
    soup = BS(html_content, 'lxml') 


    table = soup.find('table', class_='bigborder') 
    if not table: 
     continue 

    trs = table.find_all('tr') 

    if not trs: 
     continue #if trs are not found, then starting next iteration with other link 


    headers = trs[0] 
    headers_list=[] 
    for td in headers.find_all('td'): 
     headers_list.append(td.text) 
    headers_list+=['Season'] 
    headers_list.insert(19,'pseudocol1') 
    headers_list.insert(20,'pseudocol2') 
    headers_list.insert(21,'pseudocol3') 

    row = [] 
    season = '' 
    for tr in trs[1:]: 
     if 'Season' in tr.text: 
      season = tr.text 

     else: 
      tds = tr.find_all('td') 
      for td in tds: 
       row.append(td.text.strip('\n').strip('\r').strip('\t').strip('"').strip()) 
      row.append(season.strip()) 
      res.append(row) 
      row=[] 

res = [i for i in res if i[0]!=''] #outside of loop 

df=pd.DataFrame(res, columns=headers_list) #outside of loop 
del df['pseudocol1'],df['pseudocol2'],df['pseudocol3'] 
del df['VideoReplay'] 

Ich frage mich, was ist der Zweck eines wiederholten row =[] im else Zustand des Hinzufügens und warum das funktioniert . Vielen Dank.

+1

Als eine lustige Übung, ersetzen Sie 'row = []' mit 'row.clear()' und beobachten Sie die Magie. –

+0

Res wurde: [[], [], [], ...] Was bedeutet das? –

Antwort

0

Die row=[] innerhalb der Schleife löscht die Liste und macht sie wieder leer. Da die Liste einmal vor der for-Schleife deklariert wird, würde sie ansonsten Elemente weiterführen, die in einer for-Iteration an die andere angehängt wurden. Doing row=[] löscht es wieder auf eine leere Liste.

+0

Es sollte hinzugefügt werden, dass Sie es einer neuen leeren Liste zuweisen und nicht nur löschen. Du könntest es durch 'del row [:]' löschen, aber dann wird dein res betroffen sein. – corn3lius

+0

Meinst du, dass ohne die row = [] das Ergebnis res = [['A'], ['A', 'B'], ['A', 'B', 'C'] anstatt [ [A, B, C]]? –

0

Die Art, wie ich es sehe, wenn Sie die row nicht zurücksetzen, dann werden Sie immer die Speicherung der vorherigen Ergebnisse mehr und mehr wiederholen, mit res.append(row) gerade oben.