2014-07-10 30 views
0

我試圖從網站上刮取一些json數據。我使用BeautifulSoup (bs4)如下面的代碼中Beautifulsoup Parser截斷較大的json

import re 
import csv 
import json 
import urllib2 
from bs4 import BeautifulSoup as BS 

city = 'Helsinki'; 

csvFile = csv.writer(open(city + ".csv", "wb+")) 
csvFile.writerow(["tempid","latitude", "longitude"]) 

pageID = 0 

locPage = urllib2.urlopen("http://runkeeper.com/user/maxspowers79/route/2481336") 
soup = BS(locPage, "lxml").findAll('script',{"src":False}) 
print soup 
pageID += 1 
print pageID 
for s in soup: 
    if 'routePoints' in s.string: 
     value = "[{" + s.string.split("}];")[0].split("[{")[1] + "}]" 
     #print value 
     jsonObj = json.loads(value) 
     for x in jsonObj: 
      csvFile.writerow([pageID,x["latitude"],x["longitude"]]) 

作爲一個例子,這是runkeeper網站,我測試過上一個隨機地城和隨機路線。該代碼適用於其他類似網頁,但適用於更長的路線(如果您在瀏覽器中查看源代碼,則使用更大的gps json)。

soup變量將被截斷,如您從發出的打印命令中看到的那樣。因此,json無效,我無法解析它。

我嘗試過使用不同的解析器(html5lib),但那樣更糟。變量能容納多少字符串有多大?

否則爲什麼會截斷?

我該如何處理?

+0

我已經測試了一個包含json變量''routePoints''中超過9萬個座標的虛擬runkeeper頁面,並且它工作正常,解析良好,所有項目都保存在輸出中文件。 我想這不是BeautifulSoup問題,因爲你的代碼對我來說工作得很好。 – AniversarioPeru

+0

@AniversarioPeru您是否嘗試過我發佈的這個特定的管理員頁面? – sfactor

+0

是的,並沒有與該特定頁面的問題。這就是爲什麼我增加了數據量來查看它是否會失敗。 – AniversarioPeru

回答

1

我測試了你的代碼,看起來像 - 是的 - BeautifulSoup對標籤內容有一些限制。

考慮使用啞和簡單的字符串代替manipulaion:

import re 
import csv 
import json 
import urllib2 

city = 'Helsinki'; 

csvFile = csv.writer(open(city + ".csv", "wb+")) 
csvFile.writerow(["tempid","latitude", "longitude"]) 

pageID = 0 

locPage = urllib2.urlopen("http://runkeeper.com/user/maxspowers79/route/2481336") 
content = locPage.read() 

start_at_s, end_at_s = 'var routePoints = ', 'mapController.initialize' 

start_at_p = content.index(start_at_s) + len(start_at_s) 
end_at_p = content.index(end_at_s) 
raw_json = content[start_at_p:end_at_p].strip().strip(';') 

jsonObj = json.loads(raw_json) 

pageID += 1 
print pageID 


for x in jsonObj: 
    print x 
    csvFile.writerow([pageID,x["latitude"],x["longitude"]]) 
+0

這段代碼現在爲我做了竅門。謝謝 ! – sfactor

0

嘗試LXML重寫代碼。它應該比beautifulsoup更強大