2017-06-20 26 views
1

の特定の要素をこすりするより良い方法私はこのURLでテーブルからいくつかの公に利用可能な小売データをスクレイピングしています:https://502data.com/retailers美しいスープ - テーブル

私の目標は、例えば、列ごとにPythonでリストを作成することですウェブテーブルのその列のすべてのエントリを含む「Name_list」、「County_list」などを含む。ここで

は窮地を使い始めるための私のコードです:

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

私のall_text変数は必要ないかもしれないように私には思えます。私が現在実現しているよりも、これを行うためには、より滑らかな方法が必要であるように見えます。

all_text[7200:8000] 

上記利回り:たとえば

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"}, ... 

私は$ scope.retailers後= Iが解析する簡単な方法のように見えるものに保存されている、私は必要なすべての情報を持っていることがわかります。

私は美しいスープに慣れていないので、スープまたはall_text変数を使用してこのテーブルをループし、Webテーブルの各行のデータを引き出すのに最適なコマンドを知ることができます。

この問題の具体的な解決方法と、初心者のための一般的なBeautifulSoupアドバイスをお探しください。

答えて

1

これは実際にあなたが解析するHTMLのではなく、JavaScriptのコードではありませんので、私はslimitのように、JavaScriptのパーサを使用するか、または正規表現使用することになり、次のいずれか

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"]) 

をここに括弧"capturing group"を意味し、バックスラッシュは文字をエスケープするために使用されます。

BeautifulSoupを使用せずにページソースに対して直接式を適用しています。このscript要素を見つけて、script要素のテキストにその式を適用することもできます。

+0

よろしくお願い致します。レスポンス変数の 'ヘッダー'によって何が指定されているのか説明できますか? – pavlov

+0

@pavlovこの場合、カスタムのユーザーエージェントヘッダーを指定する必要はありません。ちょうど私の悪いWebスクレイピングの癖です。 – alecxe

+0

それは何ですか?あなたは擦り傷に使用しているコンピュータとブラウザを指定していますか? – pavlov

関連する問題