0

私は次のデータを処理するための最良の方法を見つけようとしています。サイトをスクレイピングし、テキスト(.prn)ファイル(印刷用のファイル。これは必要なデータを含むファイルです。AdobeAcrobatファイルよりも優れていると思います)を使用してデータを収集しています。私の問題は、データをPythonに取り込むときです。データは、一度に1文字ずつ画面の垂直方向に表示されるため、複数の行がある場合でも、このデータは1つの列にストリーミングされます。行[0]、行[1]などを取り込むことができるより「従来の」方法でデータを取り込む方法を誰かが知っているだろうかと思います...これが役立つ場合の私のコードです(あなた私が試した他の機能のいくつかも見ることができます)。

import os
import urllib
import urllib2
import string
import sys
import os
from bs4 import BeautifulSoup
import csv
import mechanize
from numpy import*
import datetime
import traceback
from pylab import*
site="http://www.treasurydirect.gov/govt/reports/pd/mspd/mspd.htm"

br = mechanize.Browser()
br.set_handle_equiv(False)
br.open(site)
print 'br.title',br.title()
allforms = list(br.forms())
br.form = allforms[0]
br.follow_link(text_regex="February", nr=0)
#br.click_link(text='February', nr=0) # this works to

#next page
print br.title()
allforms = list(br.forms())
print allforms
br.form = allforms[0]   
getstuff=br.click_link(text="Text (.prn)", nr=0) # this works to
#getstuff= br.click_link(text="Adobe Acrobat (.pdf)", nr=0)  Adobe Acrobat (.pdf)

br.open(getstuff)


csvData=br.response().read() # use read to BeautifulSoup(x)
#site = BeautifulSoup(csvData)
#print site
for row in csvData:
 print row[0]

テキスト(.prt)ファイルがある正確なサイトページは次のとおりです。http: //www.treasurydirect.gov/govt/reports/pd/mspd/2013/2013_feb.htm

サマリーの下のテキスト(.prn)ファイルのデータを処理しようとしています。データを処理するための最良の方法についてアドバイスをお願いします。

私はpython27、機械化、美しいスープとurllibを使用しています

4

1 に答える 1

0

美しいスープを含むテキスト ファイルを読み取ると、期待どおりの行のリストではなく、csvData に 1 つの文字列が返されるようです。したがって、文字列を反復すると、反復ステップごとに単一の文字が返されます。これが、テキストが単一の列に転置されたように見える理由です。

まず、あなたは美しいスープをまったく必要としないようです!HTMLファイルではなく、テキストファイルを取得しています。Beautiful Soupは HTML/XML パーサーです。また、機械化は私には不必要に思えます (以前の質問を見たことがありますが、実際には、最終的な URL を既に知っているので、リンクを見つけるために HTML ページを解析する必要はありません)。

私には、アルゴリズムを 3 つの部分に分割する必要があります。

  • テキストを行のリストとして取得する
  • 不要な行を削除
  • 目的に合わせて行をフォーマットする

あなたの質問は主に最初の部分に関連しているようですが、最終データを取得する方法についてもアドバイスを求めているので、他の2つも必要になると思います:)

ここに私の提案があります: アルゴリズムの各部分に 1 つずつ、3 つの関数の定義を始めましょう...

import urllib2, re

def get_data_text(month, year):
    """given a month and a year, this method returns the raw data file (as a list of rows)"""
    url_pattern = 'http://www.treasurydirect.gov/govt/reports/pd/mspd/{year:4d}/opds{month:02d}{year:4d}.prn'
    url = url_pattern.format(month=month, year=year)
    source = urllib2.urlopen(url)
    data = source.readlines()
    source.close()
    return data


def keep_only_interesting_rows(data, interesting_rows):
    """filter data rows in order to keep only the ones that start with strings in interesting_rows list"""
    return [line for line in data if any([line.strip().startswith(ir) for ir in interesting_rows])]


def convert_data_to_dict(data):
    """converts every row in data to a dictionary element """
    return {re.sub('\.*\s*$', '', el[0:46]).strip():(int(el[47:63].replace(',','')), int(el[69:90].replace(',','')), int(el[95:115].replace(',',''))) for el in data}

これで、提案したソリューションの各部分に 1 つずつ、3 つの関数を定義しました。


これらの機能を使用するには?以下に例を示します。

interesting_rows = ['Bills', 'Notes', 'Total Public Debt Outstanding']  # add the initial part of any row you are interested at (without leading spaces)

mytext = get_data_text(2, 2013)  # gets the text for feb, 2013 as rows
data = keep_only_interesting_rows(mytext, interesting_rows)  # filter rows
final_data = convert_data_to_dict(data)  # convert remaining rows into a dict

print final_data
print final_data['Bills'][2]  # this gives you the third column


# >>> {'Notes': (7416574, 5888, 7422462), 'Bills': (1738404, 3546, 1741950), 'Total Public Debt Outstanding': (11822436, 4864853, 16687289)}
# >>> 1741950


何らかの理由で、最初のテキストファイル (.prn ファイル) の正確な行にアクセスしたい場合は、次のように入力できます。

mytext = get_data_text(9, 2012)  # this time let's get the text for September, 2012 
print mytext[0]

それは次を返します:

    MONTHLY STATEMENT OF THE PUBLIC DEBT
于 2013-03-21T23:28:07.167 に答える