1

この URL にアクセスしようとしています:

http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=05&b=20&c=2013&d=05&e=28&f=2013&g=d&ignore=.csv

ただし、常に GOOG である代わりに、次のように変数 ticker_list に入力されたものになります。

私がこれを行うと、動作します:

URL = urllib.request.urlopen("http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=05&b=20&c=2013&d=05&e=28&f=2013&g=d&ignore=.csv")
html = URL.read()
print (html)

しかし、私がこれを行うと:

filename = input("Please enter file name to extract data from: ")
with open(filename) as f:
    data = f.readlines()    # Read the data from the file

tickers_list = []
for line in data:
    tickers_list.append(line)   # Separate tickers into individual elements in list

print (tickers_list[0]) # Check if printing correct ticker
url = "http://ichart.finance.yahoo.com/table.csv?s=%s&a=00&b=1&c=2011&d=05&e=28&f=2013&g=d&ignore=.csv" % str(tickers_list[0])
print (url) # Check if printing correct URL

URL = urllib.request.urlopen(url)
html = URL.read()
print (html)

そして、私にこのエラーを与えます:

urllib.error.URLError: <urlopen error no host given>

文字列のフォーマットを正しく行っていませんか?

4

2 に答える 2

2

Python で URL を操作するには、 furlまたはURLObjectの 2 つの解決策をお勧めします。これら 2 つのライブラリは、URL を簡単に操作するための非常に優れたインターフェイスを提供します。

furlドキュメントの例:

>>> from furl import furl
>>> f = furl('http://www.google.com/?one=1&two=2')
>>> f.args['3'] = '3'
>>> del f.args['one']
>>> f.url
「http://www.google.com/?two=2&three=3」
于 2013-06-29T22:15:09.240 に答える
2

ファイル名から読み取っているデータには、各行の末尾に改行が含まれています (.readlines()は削除しません)。これは自分で削除する必要があります。str.strip()改行を含むすべての空白を削除します。

filename = input("Please enter file name to extract data from: ")
with open(filename) as f:
    tickers_list = f.readlines()    # .readlines() returns a list *already*

print(tickers_list[0].strip())
url = "http://ichart.finance.yahoo.com/table.csv?s=%s&a=00&b=1&c=2011&d=05&e=28&f=2013&g=d&ignore=.csv" % tickers_list[0].strip()
print(url)

response = urllib.request.urlopen(url)
html = response.read()
print(html)

ファイルから読み取るとすでに文字列のリストが生成されるためstr()、要素を呼び出す必要はありません。tickers_list[0]さらに、%sフォーマット プレースホルダーは、その値がまだ文字列でない場合、その値を文字列に変換します。

改行 (以下\nの出力の文字) を使用repr()すると、表示される正確なエラーが表示されます。

>>> url = "http://ichart.finance.yahoo.com/table.csv?s=%s&a=00&b=1&c=2011&d=05&e=28&f=2013&g=d&ignore=.csv" % 'GOOG\n'
>>> print(repr(url))
'http://ichart.finance.yahoo.com/table.csv?s=GOOG\n&a=00&b=1&c=2011&d=05&e=28&f=2013&g=d&ignore=.csv'
>>> urllib.request.urlopen(url)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python3.3/urllib/request.py", line 156, in urlopen
    return opener.open(url, data, timeout)
  File "/Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python3.3/urllib/request.py", line 467, in open
    req = meth(req)
  File "/Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python3.3/urllib/request.py", line 1172, in do_request_
    raise URLError('no host given')
urllib.error.URLError: <urlopen error no host given>

ファイル入力から1行だけを処理する場合は、 を使用f.readline()してその 1 行を読み取り、リストをインデックス化する手間を省きます。改行を削除する必要があります。

すべての行を処理する場合は、入力ファイルを直接ループするだけです。これにより、各行が個別に生成さ、改行が追加されます。

with open(filename) as f:
    for ticker_name in f:
        ticker_name = ticker_name.strip()
        url = "http://ichart.finance.yahoo.com/table.csv?s=%s&a=00&b=1&c=2011&d=05&e=28&f=2013&g=d&ignore=.csv" % ticker_name

        # etc.
于 2013-06-29T22:00:21.787 に答える