2017-06-20 2 views
1

ich aus der Tabelle unter dieser URL einig öffentlich zugängliche Handelsdaten am Schaben: https://502data.com/retailersSchöne Suppe - bessere Möglichkeit, bestimmte Elemente einer Tabelle zu kratzen

Mein Ziel ist es, eine Liste in Python für jede Spalte zu erstellen, beispielsweise eine "Name_liste" mit allen Einträgen in dieser Spalte der Webtabelle, eine "County_list" und so weiter.

Hier ist mein Code für die schaben Sie beginnen:

r = requests.get(url_to_scrape) 
soup = BeautifulSoup(r.text, 'html.parser') 
all_text = soup.get_text() 

Es scheint mir, dass meine all_text Variable nicht notwendig sein kann. Es sieht so aus, als müsste es einen besseren Weg dafür geben, als ich derzeit realisiere. Zum Beispiel:

all_text[7200:8000] 

Die oben genannten Erträge:

u', function($scope, $filter) {\n     $scope.retailers = [{"licensenumber":"414876","name":"MAIN STREET MARIJUANA","city":"VANCOUVER","county":"CLARK","year":2017,"month":5,"sales":41170232.357500,"tax":14971101.020000,"recentSales":1374866.000000,"recentTax":508700.000000,"monthName":"May"}, ... 

kann ich das nach $ scope.retailers sehen = Ich habe alle Informationen, die ich in gespeichert werden soll, was aussieht wie eine einfache Art und Weise zu analysieren.

Ich bin einfach nicht vertraut mit Beautiful Soup genug, um die besten Befehle für mich zu kennen, um durch diese Tabelle zu gehen, entweder mit der Suppe oder all_text-Variable, und ziehen Sie die Daten in jeder Zeile der Web-Tabelle.

Auf der Suche nach einer spezifischen Lösung für dieses Problem sowie alle allgemeinen BeautifulSoup Ratschläge für einen Anfänger.

Antwort

1

Da dies nicht eigentlich die HTML Sie analysieren wollen, sondern eher JavaScript-Code, würde ich entweder einen JavaScript-Parser verwenden, wie slimit, oder verwenden Sie einen regulären Ausdruck:

import json 
import re 

import requests 


url = "https://502data.com/retailers" 
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'}) 

pattern = re.compile(r"\$scope\.retailers = (\[.*?\]);") 

match = pattern.search(response.text) 
data = json.loads(match.group(1)) 
for item in data: 
    print(item["name"]) 

Die Klammer hier bedeuten ein "capturing group", Backslashes werden verwendet, um die Zeichen zu entkommen.

Beachten Sie, dass ich den Ausdruck direkt auf die Seitenquelle anwenden, ohne BeautifulSoup überhaupt zu verwenden. Wir können es jedoch verwenden, um dieses script Element zu lokalisieren und dann den Ausdruck auf den Text des Elements script anzuwenden.

+0

Großartig, danke! Können Sie erklären, was in der Antwortvariablen durch 'headers' angegeben ist? – pavlov

+0

@pavlov es ist nicht wirklich notwendig, die benutzerdefinierte Benutzer-Agent-Header in diesem Fall, nur meine schlechte Web-Scraping Gewohnheit :) – alecxe

+0

Ok, aber was ist das? Sie geben an, welchen Computer und welchen Browser Sie für das Scrape verwenden? – pavlov