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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

448閲覧

スクレイピング結果で文字化けが取れない

chouchou

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/06/17 08:02

編集2022/06/17 08:08

あるDBからスクレイピングしてきた結果のCSVに¡が入ってしまい、これがどのようにしたら取れるのかがわからずにいます。
元のスクレイピングのどこを修正すべきでしょうか。
それとも、結果から削除できるかと思い、.replaceでやってみたのですが、できませんでした(安直な考えだったかもしれません・・)
もし知見がある方がいらっしゃったら、ご教授頂けると幸いです。

(結果のCSV)
0 2022/01/01 ¡¡¡¡01:00 ¡¡¡¡¡¡0.83
1 2022/01/01 ¡¡¡¡02:00 ¡¡¡¡¡¡0.83
2 2022/01/01 ¡¡¡¡03:00 ¡¡¡¡¡¡0.83
3 2022/01/01 ¡¡¡¡04:00 ¡¡¡¡¡¡0.83
4 2022/01/01 ¡¡¡¡05:00 ¡¡¡¡¡¡0.83

(元のスクレイピング)https://qiita.com/fftcy-sttkm/items/3d92d85c69669c44872c から考え方を拝借させて頂いています。

#ライブラリ import pandas as pd import csv import time from datetime import datetime from datetime import timedelta import requests from bs4 import BeautifulSoup #関数群 #時間を変換する関数 def time_tyconv(time): if isinstance(time,str):return datetime.strptime(time,'%Y%m%d') elif isinstance(time,datetime):return time.strftime("%Y%m%d") else:raise TypeError('type-err!') #日付からステップ数を算出する関数 def step_number(start_date, end_date): s = time_tyconv(start_date) e = time_tyconv(end_date) return int(((e-s).days + 1)//8) #●日後の日付データを求める関数 def date_after_days(time,days): day_after = time_tyconv(time) + timedelta(days=days) return time_tyconv(day_after) #任意期間のデータを水門水質DBからスクレイピングする関数 def scrp_DB(start_date, end_date, location_id,result_list): base_url = 'http://www1.river.go.jp' url = "http://www1.river.go.jp/cgi-bin/DspWaterData.exe" params = { "KIND":1, "ID":location_id, "BGNDATE":start_date, "ENDDATE":end_date, "KAWABOU":"NO" } #iframeのhtmlからsrcURLを取得 resp = requests.get(url,params=params) temp_soup = BeautifulSoup(resp.text,'html.parser') resp_iframe = requests.get(base_url+temp_soup.iframe['src']) #srcURLのhtmlを取得(iframe内) soup = BeautifulSoup(resp_iframe.text,'html.parser') soup = soup.select_one("table[border='0']") tr_list = soup.find_all("tr") tr_list.pop(0) for tr in tr_list: result_row = [] td_list = tr.find_all('td') for td in td_list: cell = td.get_text() result_row.append(cell) result_list.append(result_row) return result_list #Mainの処理 #取得期間、地点番号、保存ファイル名設定 start_date = "20220101" end_date = "20220131" csvfile_name = "result.csv" location_id = "308041288813010" n_step = step_number(start_date, end_date) result_list = [] for n in range(n_step): result_list = scrp_DB(start_date, date_after_days(start_date,7), location_id, result_list) start_date = date_after_days(start_date,8) time.sleep(2) result = scrp_DB(start_date, end_date,location_id,result_list) with open(csvfile_name, 'w') as file: writer = csv.writer(file, lineterminator='\n') writer.writerows(result)

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • requestsの文字コード自動判定の結果が間違っている
  • セルに余計な全角スペースが入っている

のが原因なので

  • soup = BeautifulSoup(resp_iframe.text, ~)の手前にresp_iframe.encoding = resp_iframe.apparent_encodingを追加。
  • cell = td.get_text()cell = td.get_text(strip=True)に修正。

するとよいです。

投稿2022/06/17 09:05

can110

総合スコア38266

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

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

chouchou

2022/06/17 23:06

訂正部分の簡潔なご回答、恐れ入ります。 requestsモジュールについてその後調べてみました。このあたり自身の認識が甘かったです。 全角スペースについても気づけませんでした。。もう少し勉強します。 期待した内容での切り出しが出来ました。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問