質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1201閲覧

Python: requests.get(url)でurlに&0Dが出現してしまう

send0696

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/19 02:15

編集2021/11/19 06:14

前提・実現したいこと

Pythonにて、アメリカの財務系データベースEDGARをスクレイピングしたいです。

下記サイトのパッケージを使用してスクレイピングを進めています。

Python – SEC Edgar Scraping Financial Statements
https://codingandfun.com/python-sec-edgar-scraper/

しかし、requests.get(url)のところでつまづいています。

該当のソースコード

python

1import requests 2 3selectedcompany = 'Alphabet Inc.' 4selectedreport = '10-Q' 5 6csv = pd.read_csv('2019-QTR4.tsv', sep='\t', lineterminator='\n', names=None) 7 8csv.columns.values[0] = 'Item' 9 10companyreport = csv[(csv['Item'].str.contains(selectedcompany)) & (csv['Item'].str.contains(selectedreport))] 11 12Filing = companyreport['Item'].str.split('|') 13Filing = Filing.to_list() 14 15for item in Filing[0]: 16 17 if 'html' in item: 18 report = item 19 20url = 'https://www.sec.gov/Archives/' + report 21 22headers_dic = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"} 23 24print(url) 25#urlの値確認用 26 27r = requests.get(url, headers=headers_dic) 28 29print(r.url) 30#rのurlの値確認用 31 32df = pd.read_html(r.text)

発生している問題・エラーメッセージ

print(url)結果
https://www.sec.gov/Archives/edgar/data/1652044/0001652044-19-000032-index.html

print(r.url)結果
https://www.sec.gov/Archives/edgar/data/1652044/0001652044-19-000032-index.html%0D

と、謎の%0D(キャリッジコード)が末尾に入り、その後のコードに進めません。
このキャリッジコードが発生しなくしたいです。また、今後のために発生する原因も知りたいです。

試したこと

・replaceなどで末尾の文字を削ろうとしましたが、そうするとresponceではなく文字列になってしまうため×
・url = の部分に直接urlを打ち込んで代入する→%0Dは出現せず
・requests.getのurlに直接urlを打ち込む→無事取得可能
・海外同様事例の検索(https://stackoverflow.com/questions/65030697/how-to-remove-0d-in-python-requests)→状況が少し異なる

urlの代入部分で+reportを使っているのが原因なのはなんとなくわかりました。改行や空白などはできるかぎり消したのですが、それでも結果は同様です。

report値部分を改善してどうにかならないか確認しているところですが、python初心者のため難航しています。みなさまのお知恵をお借りできればとおもい質問させていただきました。

よろしくお願いいたします。

###環境
Jupyter Notebook
Anaconda

###解決後捕捉
print(repr(url))結果
https://www.sec.gov/Archives/edgar/data/1652044/0001652044-19-000032-index.html\r
↑この/r(キャリッジコード)が入っていたのが原因でした。通常のprint(url)ではみえないことを知りませんでした。rstripでurlからこの文字列を削りました。また、そもそもlineterminator='\n'を指定していたため/rが入ってしまったようです。lineterminator指定が必要かどうかは検証中です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2021/11/19 02:26

print(url) は print(repr(url)) を確認した方がいいですよ。その結果を質問に書いた方が早いかもしれません。
melian

2021/11/19 04:07

既に解決済みですが、元のファイル 2019-QTR4.tsv の改行コードはどうなっていますでしょうか?
guest

回答2

0

今後のために発生する原因も知りたいです。

読み込むファイル 2019-QTR4.tsv の改行コードが \r\n となっていると、pd.read_csv で指定されている lineterminator='\n' によって \r(carriage return)が残ってしまいます。今回、抽出している URL 文字列が各行の末尾にあるために report 変数の内容に \r が入ってしまったのだと思われます。
lineterminator を指定しない場合は Pandas が自動的に \r\n を削除してくれます。

python

1csv = pd.read_csv('D:/toushi/2019-QTR4.tsv', sep='\t', lineterminator='\n', names=None) 2csv.columns.values[0] = 'Item' 3 4companyreport = csv[(csv['Item'].str.contains(selectedcompany)) & (csv['Item'].str.contains(selectedreport))] 5 6Filing = companyreport['Item'].str.split('|') 7Filing = Filing.to_list() 8 9for item in Filing[0]: 10 if 'html' in item: 11 report = item 12 13>>> print(report.encode()) 14b'edgar/data/1652044/0001652044-19-000032-index.html\r'

投稿2021/11/19 02:52

編集2021/11/19 04:43
melian

総合スコア19912

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

send0696

2021/11/19 04:03

わざわざ時間をとっていただきありがとうございました!
melian

2021/11/19 04:08

入れ違いになってしまいましたが、もしかすると lineterminator の指定が影響しているのかもしれません。
send0696

2021/11/19 04:39

なるほど、ありがとうございます! 根本原因についてもわかって勉強になりました。 lineterminatorは元の解説動画の言われるがまま指定していたのですが、やはりひとつひとつきちんと理解していかないとダメなんですね…… いじりながら把握していこうとおもいます。
guest

0

ベストアンサー

元のurlの末尾に\rがついていると思われます。
元からrstripなりで除去すればよいでしょう。

Python

1import requests 2 3url = 'http://www.example.com/' + '\r' 4print(url) # http://www.example.com/ 5r = requests.get(url) 6print(r.url)# http://www.example.com/%0D

投稿2021/11/19 02:24

can110

総合スコア38286

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

send0696

2021/11/19 04:04 編集

ありがとうございます! 以下のように追記して正しく動きました。 ``` url = 'https://www.sec.gov/Archives/' + report #以下追記部分 url = url.rstrip("\r") ``` \rが語尾のprint(url)では見えないとは盲点でした。勉強になりました。あらためてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問