2016-12-26 4 views
1

Ich versuche, von dieser Webseite (http://www.basketball-reference.com/teams/CHO/2017.html) alle Elemente zu extrahieren, die der Tabelle (Team Misc) entsprechen.Python crawl Tabellenelemente

Ich möchte von „Team“ alle Zahlen extrahieren - (diese Zeile: 17 13 2,17 -0,51 1,66 106,9 104,7 96,5 .300 .319 .493 10,9 20,5 .228 .501 11,6 79,6 .148 Spectrum Center 269 , 47)

import urllib2 
from bs4 import BeautifulSoup 

htmla = urllib2.urlopen('http://www.basketball-reference.com/teams/CHO/2017.html') 
bsObja=BeautifulSoup(htmla,"html.parser") 
tables = bsObja.find_all("table") 

Ich habe den obigen Code versucht, in der Hoffnung, dass ich eine Liste aller Tabellen erhalten und dann die richtige wählen werde. Aber egal wie ich es versuche, ich bekomme nur 1 Tisch von dieser Seite.

Irgendwelche Ideen zu einem anderen Ansatz?

+0

Bitte fügen Sie dieses Bild direkt in Ihre Frage ein, anstatt eines Links, der jederzeit unterbrochen werden könnte. – ettanany

+0

Diese Seite enthält alle Daten im HTML-Format, wird jedoch als Kommentare ausgeblendet und verwendet JavaScript, um sie anzuzeigen. Aber Sie können 'BeautifuSoup' verwenden, um diese Kommentare zu finden, entfernen Sie' 'und verwenden Sie das Ergebnis mit' BeautifuSoup', um Daten zu erhalten. Ich denke, dass dieses Problem in einer Frage vorher gelöst wurde. – furas

Antwort

2

Diese Seite wollen alle Tabellen in den Kommentaren versteckt hat und JavaScript verwendet sie Tabelle anzuzeigen und wahrscheinlich vor der Anzeige oder Filter zu sortieren.

Alle Kommentare sind nach <div class='placeholder'>, so können Sie dies verwenden, um diese Kommentare zu finden, erhalten Sie alle Texte aus dem Kommentar und BS verwenden, um es zu analysieren.

#!/usr/bin/env python3 

#import urllib.request 
import requests 
from bs4 import BeautifulSoup as BS 

url = 'http://www.basketball-reference.com/teams/CHO/2017.html' 

#html = urllib.request.urlopen(url) 
html = requests.get(url).text 

soup = BS(html, 'html.parser') 

placeholders = soup.find_all('div', {'class': 'placeholder'}) 

total_tables = 0 

for x in placeholders: 
    # get elements after placeholder and join in one string 
    comment = ''.join(x.next_siblings) 

    # parse comment 
    soup_comment = BS(comment, 'html.parser') 

    # search table in comment 
    tables = soup_comment.find_all('table') 

    # ... do something with table ... 

    #print(tables) 

    total_tables += len(tables) 

print('total tables:', total_tables)  

So fand ich 11 Tabellen in Kommentaren versteckt.

0

Ich glaube, Sie

tables = bsObja.findAll("table") 
+0

Immer noch, ich bekomme nur 1 Tabelle :( –

+1

Ich habe nur auf die Seite. Es ist weil die Tabellen von JavaScript geladen werden. Sie müssen Selenium – HenryM

+0

Ok verwenden. Ich werde sehen und sehen, wie es funktioniert. Danke für den Vorschlag –

0

Die Daten in dem Kommentar-Objekt in der BS und der Kommentar Objekt ist nur eine besondere Art von NavigableString, was Sie tun müssen, sind:

  1. den Stachel finden, die die Informationen

  2. enthalten
  3. Verwenden BeautifulSoup wandeln die Zeichenfolge BS

  4. Extract Datenobjekt aus BS

Objekt

Code:

import re 
table_string = soup.find(string=re.compile('div_team_misc')) 

Dies wird den Stachel zurück, die Tabelle HTML-Code enthält.

table = BeautifulSoup(table_string, 'lxml') 

Verwenden Sie den Stachel BS Objekt zu konstruieren, und Extrahieren von Daten aus dem Objekt

for tr in table.find_all('tr', class_=False): 
    s = [td.string for td in tr('td')] 
    print(s) 

Out:

['17', '13', '2.17', '-0.51', '1.66', '106.9', '104.7', '96.5', '.300', '.319', '.493', '10.9', '20.5', '.228', '.501', '11.6', '79.6', '.148', 'Spectrum Center', '269,471'] 
['10', '9', '8', '24', '10', '17', '5', '15', '4', '11', '22', '1', '27', '5', '12', '28', '3', '1', None, '15'] 

Mehr über Kommentar:

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>" 
soup = BeautifulSoup(markup) 
comment = soup.b.string 

Das Comment-Objekt ist nur eine spezielle Art von NavigableString, BS extrahiert die Zeichenfolge aus. Wir müssen keinen HTML-Code ändern oder ersetzen.

comment 
# u'Hey, buddy. Want to buy a used parser' 

Auf dieser Basis können wir statt re reine BS verwenden Kommentar

table_string = soup.find(id="all_team_misc").contents[-2] 

zu extrahieren Wenn Sie was alle Tabellen Strings zu finden, können Sie dies tun:

from bs4 import Commnet 
tables = soup.find_all(string=lambda text:isinstance(text,Comment) and str(text).startswith(' \n'))