前提・実現したいこと
python3で,htmlからtableタグの部分をcsv化するプログラムを作成しています.
url = "https://wiki.ポケモン.com/wiki/種族値一覧_(第八世代)
として,
html = urllib.request.urlopen(url)
で指定したwebページを開こうとしても,
'latin-1' codec can't encode characters in position 5-8: ordinal not in range(256)
というエラーメッセージが表示され,開くことができません.
発生している問題・エラーメッセージ
'latin-1' codec can't encode characters in position 5-8: ordinal not in range(256)
該当のソースコード
python3
1import urllib.request 2from urllib.parse import urlparse 3import csv 4from bs4 import BeautifulSoup 5import requests 6 7url1 = "https://wiki." 8url2 = "ポケモン" 9url3 = ".com/wiki/" 10url4 = "種族値一覧_(第八世代)" 11 12url = "https://wiki.ポケモン.com/wiki/種族値一覧_(第八世代)" 13html = urllib.request.urlopen(url) 14 15 16soup = BeautifulSoup(html, 'html.parser') 17#HTMLからtableタグの部分をすべて取得 18table = soup.find_all("table") 19 20for tab in table: 21 table_className = tab.get("class") 22 print(table_className) 23 if table_className[0] == "bluetable r sortable jquery-tablesorter": 24 with open("Pokemon_Base_stats", "w", encoding='utf-8') as file: 25 writer = csv.writer(file) 26 rows = tab.find_all("tr") 27 for row in rows: 28 csvRow = [] 29 for cell in row.findAll(['td', 'th']): 30 csvRow.append(cell.get_text()) 31 writer.writerow(csvRow) 32 break 33
試したこと
エラーメッセージの検索をかけたところ,日本語部分の文字コードの問題だということだったので,
日本語部分をurllib.parse.quote()でエンコードしてurlを構築する方法を試してみました.
python3
1url1 = "https://wiki." 2url2 = "ポケモン" 3url3 = ".com/wiki/" 4url4 = "種族値一覧_(第八世代)" 5url = url = url1 + urllib.parse.quote(url2) + url3 + urllib.parse.quote(url4)
結果は同様のエラーメッセージが出力されました.
また,
https://qiita.com/mix/items/87d094414e46f857de45
こちらのページにて実行されていた
python3
1html = urllib.request.urlopen(urllib.parse.quote_plus(url, "/:?=&"))
というエンコード方法や,
python3
1url = "https://wiki.ポケモン.com/wiki/種族値一覧_(第八世代)" 2p = urlparse(url) 3query = urllib.parse.quote_plus(p.query, safe='=&') 4url = '{}://{}{}{}{}{}{}{}{}'.format( 5 p.scheme, p.netloc, p.path, 6 ';' if p.params else '', p.params, 7 '?' if p.query else '', query, 8 '#' if p.fragment else '', p.fragment) 9print (url) 10html = urllib.request.urlopen(url)
このようなエンコード方法を試してみました.
こちらの方法の場合,エラーメッセージは
'ascii' codec can't encode characters in position 10-14: ordinal not in range(128)
となりました.
補足情報(FW/ツールのバージョンなど)
仮想環境
Google Colaboratory
実機環境
iMac macOS Catalina
python 3.8.1
となっております.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/13 06:08
2020/07/13 06:24 編集
2020/07/13 07:21