2017-11-09 9 views
0

私は、オンラインの石油生産SSRSフィードからHTMLテーブルを削り取ろうとしていました。私は現時点までのところにある美しいスープ/パイソンを学ぶことができましたが、私はちょうどそれを終わらせるために少しの支援が必要だと思います。Python美味しいスープテーブルスクレイプ

すべてのタグが付けられているテーブルをスクラップし、jsonデータを出力することを目的としています。私はjson形式の出力を持っていますが、10個のヘッダーがヘッダーごとに同じデータ行セルの値を繰り返しています。私は、ヘッダーに割り当てるセルを通した反復が問題だと思います。私はそれが実行時に意味をなさないと確信しています。

私が間違っていたことを学びたいと思ったことがあれば、私にはかなり新しいことです。

乾杯

import json 
from bs4 import BeautifulSoup 
import urllib.request 
import boto3 
import botocore 

#Url to scrape 

url='http://factpages.npd.no/ReportServer?/FactPages/TableView/ 
    field_production_monthly&rs:Command=Render&rc:Toolbar= 
    false&rc:Parameters=f&Top100=True&IpAddress=108.171.128.174& 
    CultureCode=en' 


#Agent detail to prevent scraping bot detection 
user_agent = 'Mozilla/5(Macintosh; Intel Mac OS X 10_9_3) 
    AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 
    Safari/537.36' 

header = {'User-Agent': user_agent} 

#Request url from list above, assign headers from criteria above 
req = urllib.request.Request(url, headers = header) 

#Open url from the previous request and assign 
npddata = urllib.request.urlopen(req, timeout = 20) 

#Start soup on url request data 
soup = BeautifulSoup(npddata, 'html.parser') 

# Scrape the html table variable from selected website 
table = soup.find('table') 


headers = {} 

col_headers = soup.findAll('tr')[3].findAll('td') 

for i in range(len(col_headers)): 
    headers[i] = col_headers[i].text.strip() 

# print(json.dumps(headers, indent = 4)) 


cells = {} 

rows = soup.findAll('td', { 
    'class': ['a61cl', 'a65cr', 'a69cr', 'a73cr', 'a77cr', 'a81cr', 'a85cr', 
    'a89cr', 'a93cr', 'a97cr']}) 

for row in rows[i]: #remove index!(###ISSUE COULD BE HERE####) 

# findall function was original try (replace getText with FindAll to try) 

    cells = row.getText('div') 


# Attempt to fix, can remove and go back to above 
#for i in range(len(rows)): #cells[i] = rows[i].text.strip() 


#print(cells)# print(json.dumps(cells, indent = 4)) 
#print(cells)# print(json.dumps(cells, indent = 4)) 


data = [] 

item = {} 

for index in headers: 
    item[headers[index]] = cells#[index] 

# if no getText on line 47 then.text() here### ISSUE COULD BE HERE#### 

data.append(item) 


#print(data) 
print(json.dumps(data, indent = 4)) 
# print(item)# 
print(json.dumps(item, indent = 4)) 
+0

インデントはPythonでは重要です。コードサンプルに正しい字下げがあることを確認してください。 – bgse

答えて

0

あなたのコード内のいくつかのエラー、私は少し、これらのエラーを修正し、あなたのコードを修正がありました:

は、あなたが望むものを、このです:

import requests 
from bs4 import BeautifulSoup 
import json 

# Webpage connection 
html = "http://factpages.npd.no/ReportServer?/FactPages/TableView/field_production_monthly&rs:Command=Render&rc:Toolbar=false&rc:Parameters=f&Top100=True&IpAddress=108.171.128.174&CultureCode=en" 
r=requests.get(html) 
c=r.content 
soup=BeautifulSoup(c,"html.parser") 


rows = soup.findAll('td', { 
    'class': ['a61cl', 'a65cr', 'a69cr', 'a73cr', 'a77cr', 'a81cr', 'a85cr', 
    'a89cr', 'a93cr', 'a97cr']}) 

headers = soup.findAll('td', { 
    'class': ['a20c','a24c', 'a28c', 'a32c', 'a36c', 'a40c', 'a44c', 'a48c', 
    'a52c']}) 

headers_list = [item.getText('div') for item in headers] 

rows_list=[item.getText('div') for item in rows] 

final=[rows_list[item:item+9] for item in range(0,len(rows_list),9)] 

row_header={} 
for item in final: 
    for indices in range(0,9): 
     if headers_list[indices] not in row_header: 
      row_header[headers_list[indices]]=[item[indices]] 
     else: 
      row_header[headers_list[indices]].append(item[indices]) 



result=json.dumps(row_header,indent=4) 
print(result) 

サンプルの出力:

{ 
    "Year": [ 
     "2009", 
     "2009", 
     "2009", 
     "2009", 
     "2009", 
     "2009", 
     "2010", 
     "2010", 
     "2010", 
     "2010", 
     "2010", 
+0

大変感謝しています。私はあなたが固定したものを見るためにちょっとした研究をして、それから学ぶのが良いでしょう。 – Chris

+0

行ごとにレコードを作成する簡単な方法はありますか?したがって、すべての行に10個のヘッダーがある1つのjsonレコードがある場合、次のレコードに2番目の行のスクラップデータ用のヘッダーが再度表示されますか? – Chris

+0

@Chrisあなたは、各行にそれらのヘッダーが欲しい、あなたは私に例を示すことができますか? –

関連する問題