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

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

ただいまの
回答率

88.10%

python3 Visual studio2015 Webスクレイピング

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,733

score 30

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

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

# -*- coding:utf-8 -*-

import urllib.request
import codecs
from bs4 import BeautifulSoup

f = codecs.open('sake.csv')
f.write('code,meigara,kana,kuramoto,ken,shi' + "\n")

tpl_url='http://www.sakeno.com/all_meigara_todou/{0}'
headers={'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'}

for i in range( 1, 48):
    url = tpl_url.format(i)
    req = urllib.request.Request(url, headers = headers)
    soup = BeautifulSoup(urllib.request.urlopen(req).read())
    tr_arr = soup.find('table',{'class':'hyoji'}).findAll('tr')

    for tr in tr_arr:
        lrg = tr.find('a').string
        if lrg is None:
            continue
        meigara = lrg.find('a').string
        code = lrg.a.get("href").split("/")[-1]
        kana = tr.find('div',{'class':'smls'}).string

        td = tr.find('td',{"class":"smll"})
        kuramoto = td.find('strong').find('a').string
        kenshi = td.findAll('a')
        ken = kenshi[1].string

        if len( kenshi ) > 2:
            shi = kenshi[2].string
            tag = td.text

        else:
            shi = ''

        if kana is None:
            kana = ''

        #meigara = maigara.split("(")[0
        #kuramoto = kuramoto.split("(")[0]

        print(code,meigara,kana,kuramoto,ken,shi)
        f.write(code + ',' + meigara + ',' + kana + ',' + kuramoto + ',' + ken + ',' + shi + "\n")

f.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

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

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

長文失礼しました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

 SyntaxError

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

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

 UnsupportedOperation

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

 他の差分

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

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

7,8c8,9
< f = codecs.open('sake.csv')
< f.write('code,meigara,kana,kuramoto,ken,shi' + "\n")
---
> f = codecs.open('sake.csv', 'w', 'utf-8')
> f.write('code,meigara,kana,kuramoto,ken,shi,address'+ "\n")
10d10
< tpl_url='http://www.sakeno.com/all_meigara_todou/{0}'
12a13,14
> tpl_url='http://www.sakeno.com/all_meigara_todou/{0}'
>  
20c22
<         lrg = tr.find('a').string
---
>         lrg = tr.find('strong', {'class':'lrg'})
35c37,39
< 
---
>              address = tag.split(u"TEL")[0].split(" ")
>              address = ken + address[1]
>              address = address.split("(")[0]
37a42
>              address = ''
42,43c47,48
<         #meigara = maigara.split("(")[0
<         #kuramoto = kuramoto.split("(")[0]
---
>         meigara = meigara.split("(")[0]
>         kuramoto = kuramoto.split("(")[0]
45,46c50,51
<         print(code,meigara,kana,kuramoto,ken,shi)
<         f.write(code + ',' + meigara + ',' + kana + ',' + kuramoto + ',' + ken + ',' + shi + "\n")
---
>         print(code,meigara,kana,kuramoto,ken,shi,address)
>         f.write(code + ',' + meigara + ','+ kana +','+ kuramoto + ',' + ken + ',' + shi + ',' + address + "\n")
48c53
< f.close
---
> f.close()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る