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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

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

Q&A

解決済

1回答

2265閲覧

python3 Visual studio2015 Webスクレイピング

hilotoc

総合スコア30

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

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

0グッド

0クリップ

投稿2016/11/14 17:03

Visual studioの設定もようやく終わりやっとコードを書き始めました。
まずはこのサイトを写経して勉強しようとしたのですが、つまずきまくっています。。
参考したサイト

python3.5で設定されています。

python

1# -*- coding:utf-8 -*- 2 3import urllib.request 4import codecs 5from bs4 import BeautifulSoup 6 7f = codecs.open('sake.csv') 8f.write('code,meigara,kana,kuramoto,ken,shi' + "\n") 9 10tpl_url='http://www.sakeno.com/all_meigara_todou/{0}' 11headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36'} 12 13for i in range( 1, 48): 14 url = tpl_url.format(i) 15 req = urllib.request.Request(url, headers = headers) 16 soup = BeautifulSoup(urllib.request.urlopen(req).read()) 17 tr_arr = soup.find('table',{'class':'hyoji'}).findAll('tr') 18 19 for tr in tr_arr: 20 lrg = tr.find('a').string 21 if lrg is None: 22 continue 23 meigara = lrg.find('a').string 24 code = lrg.a.get("href").split("/")[-1] 25 kana = tr.find('div',{'class':'smls'}).string 26 27 td = tr.find('td',{"class":"smll"}) 28 kuramoto = td.find('strong').find('a').string 29 kenshi = td.findAll('a') 30 ken = kenshi[1].string 31 32 if len( kenshi ) > 2: 33 shi = kenshi[2].string 34 tag = td.text 35 36 else: 37 shi = '' 38 39 if kana is None: 40 kana = '' 41 42 #meigara = maigara.split("(")[0 43 #kuramoto = kuramoto.split("(")[0] 44 45 print(code,meigara,kana,kuramoto,ken,shi) 46 f.write(code + ',' + meigara + ',' + kana + ',' + kuramoto + ',' + ken + ',' + shi + "\n") 47 48f.close

ここの部分
meigara = maigara.split("(")[0]
kuramoto = kuramoto.split("(")[0]
をコメントアウトしないで書くと

line 43
SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0x81 in position 0: invalid start byte

というエラーが出てしまいます。

コメントアウトして行うと
イメージ説明
というエラーが出てしまいます。
このエラーの意味がよく分からないので、解決策と合わして教えていただけたら嬉しいです。

長文失礼しました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

SyntaxError

ファイルのエンコーディングが ShiftJIS で保存されているのが原因です。
エラーにある 0x81 は ShiftJIS の上位バイトに現れる値。

Python3.x であれば、このコードはファイル先頭の utf-8 を cp932 に変えても動くかもしれませんが、
バイト型の文字の比較等ではエンコードを変えてしまうと期待通りに動かないケースもあるので、
解決策としては、ファイルを utf-8 で保存するように環境設定した方が良いです。

UnsupportedOperation

"not writable" は、書き込みモードで開いてないファイルへ
書き込みしようとしたのが原因です。codecs.open の引数を正しく指定してください。

他の差分

他にも元のコードと違う箇所があったので、差分を添付しますね。
IDEであれば大抵、左右に並べて差分をハイライト表示する機能があると思います。

写経の場合、diff 等の差分比較ツールで調べると相違点は明白なので、
目視ではなく、こういったツールを是非活用しましょう

diff

17,8c8,9 2< f = codecs.open('sake.csv') 3< f.write('code,meigara,kana,kuramoto,ken,shi' + "\n") 4--- 5> f = codecs.open('sake.csv', 'w', 'utf-8') 6> f.write('code,meigara,kana,kuramoto,ken,shi,address'+ "\n") 710d10 8< tpl_url='http://www.sakeno.com/all_meigara_todou/{0}' 912a13,14 10> tpl_url='http://www.sakeno.com/all_meigara_todou/{0}' 11> 1220c22 13< lrg = tr.find('a').string 14--- 15> lrg = tr.find('strong', {'class':'lrg'}) 1635c37,39 17< 18--- 19> address = tag.split(u"TEL")[0].split(" ") 20> address = ken + address[1] 21> address = address.split("(")[0] 2237a42 23> address = '' 2442,43c47,48 25< #meigara = maigara.split("(")[0 26< #kuramoto = kuramoto.split("(")[0] 27--- 28> meigara = meigara.split("(")[0] 29> kuramoto = kuramoto.split("(")[0] 3045,46c50,51 31< print(code,meigara,kana,kuramoto,ken,shi) 32< f.write(code + ',' + meigara + ',' + kana + ',' + kuramoto + ',' + ken + ',' + shi + "\n") 33--- 34> print(code,meigara,kana,kuramoto,ken,shi,address) 35> f.write(code + ',' + meigara + ','+ kana +','+ kuramoto + ',' + ken + ',' + shi + ',' + address + "\n") 3648c53 37< f.close 38--- 39> f.close()

投稿2016/11/14 22:45

teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問