2017-06-20 30 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 =我有所有我想要存儲在什麼看起來像一個簡單的解析方式的信息。

我只是不熟悉美麗的湯,足以知道最好的命令讓我循環使用湯或all_text變量這張表,並拉出web表的每一行中的數據。

尋找針對此問題的具體解決方案以及任何針對初學者的一般BeautifulSoup建議。

回答

1

因爲這實際上不是要解析HTML,而JavaScript代碼,我要麼使用JavaScript分析器,像slimit,或使用正則表達式

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

太好了,謝謝!你能解釋響應變量中'headers'指定的內容嗎? – pavlov

+0

@pavlov在這種情況下,沒有必要指定自定義用戶代理標題,只是我的糟糕的網絡抓取習慣:) – alecxe

+0

好的,但那是什麼?你正在指定你使用什麼電腦和瀏覽器進行刮擦? – pavlov