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

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

ただいまの
回答率

91.35%

  • Python

    3812questions

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

pythonのValueErrorについて

解決済

回答 1

投稿 2017/11/23 12:12 ・編集 2017/11/23 13:16

  • 評価
  • クリップ 0
  • VIEW 96

mokatsu

score 1

はじめまして。
pythonを勉強し始めてまだ間もない者です。
勉強のためにホームページに書かれているコードを参照して学習しています。
そこで、「機械学習を使って東京23区のお買い得賃貸物件を探してみた 〜スクレイピング編〜」にかかれているコードを拝借さしてもらいました。
url;http://www.analyze-world.com/entry/2017/10/09/062445

コード

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

# coding: utf-8

#必要なライブラリをインポート
from bs4 import BeautifulSoup
import requests
import pandas as pd
from pandas import Series, DataFrame
import time

#URL(東京都足立区の賃貸住宅情報 検索結果の1ページ目)
url = 'http://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=030&bs=040&ta=13&sc=13121&cb=0.0&ct=9999999&et=9999999&cn=9999999&mb=0&mt=9999999&shkr1=03&shkr2=03&shkr3=03&shkr4=03&fw2=&srch_navi=1'

#データ取得
result = requests.get(url)
c = result.content

#HTMLを元に、オブジェクトを作る
soup = BeautifulSoup(c,"html.parser")

#物件リストの部分を切り出し
summary = soup.find("div",{'id':'js-bukkenList'})

#ページ数を取得
body = soup.find("body")
pages = body.find_all("div",{'class':'pagination pagination_set-nav'})
pages_text = str(pages)
pages_split = pages_text.split('</a></li>\n</ol>')
pages_split0 = pages_split[0]
pages_split1 = pages_split0[-3:]
pages_split2 = pages_split1.replace('>','')
pages_split3 = int(pages_split2)

#URLを入れるリスト
urls = []

#1ページ目を格納
urls.append(url)

#2ページ目から最後のページまでを格納
for i in range(pages_split3-1):
    pg = str(i+2)
    url_page = url + '&pn=' + pg
    urls.append(url_page)

name = [] #マンション名
address = [] #住所
locations0 = [] #立地1つ目(最寄駅/徒歩~分)
locations1 = [] #立地2つ目(最寄駅/徒歩~分)
locations2 = [] #立地3つ目(最寄駅/徒歩~分)
age = [] #築年数
height = [] #建物高さ
floor = [] #階
rent = [] #賃料
admin = [] #管理費
others = [] #敷/礼/保証/敷引,償却
floor_plan = [] #間取り
area = [] #専有面積

#各ページで以下の動作をループ
for url in urls:
    #物件リストを切り出し
    result = requests.get(url)
    c = result.content
    soup = BeautifulSoup(c)
    summary = soup.find("div",{'id':'js-bukkenList'})

    #マンション名、住所、立地(最寄駅/徒歩~分)、築年数、建物高さが入っているcassetteitemを全て抜き出し
    cassetteitems = summary.find_all("div",{'class':'cassetteitem'})

    #各cassetteitemsに対し、以下の動作をループ
    for i in range(len(cassetteitems)):
        #各建物から売りに出ている部屋数を取得
        tbodies = cassetteitems[i].find_all('tbody')

        #マンション名取得
        subtitle = cassetteitems[i].find_all("div",{
            'class':'cassetteitem_content-title'})
        subtitle = str(subtitle)
        subtitle_rep = subtitle.replace(
            '[<div class="cassetteitem_content-title">', '')
        subtitle_rep2 = subtitle_rep.replace(
            '</div>]', '')

        #住所取得
        subaddress = cassetteitems[i].find_all("li",{
            'class':'cassetteitem_detail-col1'})
        subaddress = str(subaddress)
        subaddress_rep = subaddress.replace(
            '[<li class="cassetteitem_detail-col1">', '')
        subaddress_rep2 = subaddress_rep.replace(
            '</li>]', '')

        #部屋数だけ、マンション名と住所を繰り返しリストに格納(部屋情報と数を合致させるため)
        for y in range(len(tbodies)):
            name.append(subtitle_rep2)
            address.append(subaddress_rep2)

        #立地を取得
        sublocations = cassetteitems[i].find_all("li",{
            'class':'cassetteitem_detail-col2'})

        #立地は、1つ目から3つ目までを取得(4つ目以降は無視)
        for x in sublocations:
            cols = x.find_all('div')
            for i in range(len(cols)):
                text = cols[i].find(text=True)
                for y in range(len(tbodies)):
                    if i == 0:
                        locations0.append(text)
                    elif i == 1:
                        locations1.append(text)
                    elif i == 2:
                        locations2.append(text)

        #築年数と建物高さを取得
        tbodies = cassetteitems[i].find_all('tbody')
        col3 = cassetteitems[i].find_all("li",{
            'class':'cassetteitem_detail-col3'})
        for x in col3:
            cols = x.find_all('div')
            for i in range(len(cols)):
                text = cols[i].find(text=True)
                for y in range(len(tbodies)):
                    if i == 0:
                        age.append(text)
                    else:
                        height.append(text)

    #階、賃料、管理費、敷/礼/保証/敷引,償却、間取り、専有面積が入っているtableを全て抜き出し
    tables = summary.find_all('table')

    #各建物(table)に対して、売りに出ている部屋(row)を取得
    rows = []
    for i in range(len(tables)):
        rows.append(tables[i].find_all('tr'))

    #各部屋に対して、tableに入っているtext情報を取得し、dataリストに格納
    data = []
    for row in rows:
        for tr in row:
            cols = tr.find_all('td')
            for td in cols:
                text = td.find(text=True)
                data.append(text)

    #dataリストから、階、賃料、管理費、敷/礼/保証/敷引,償却、間取り、専有面積を順番に取り出す
    index = 0
    for item in data:
        if '階' in item:
            floor.append(data[index])
            rent.append(data[index+1])
            admin.append(data[index+2])
            others.append(data[index+3])
            floor_plan.append(data[index+4])
            area.append(data[index+5])
        index +=1

    #プログラムを10秒間停止する(スクレイピングマナー)
    time.sleep(10)

#各リストをシリーズ化
name = Series(name)
address = Series(address)
locations0 = Series(locations0)
locations1 = Series(locations1)
locations2 = Series(locations2)
age = Series(age)
height = Series(height)
floor = Series(floor)
rent = Series(rent)
admin = Series(admin)
others = Series(others)
floor_plan = Series(floor_plan)
area = Series(area)

#各シリーズをデータフレーム化
suumo_df = pd.concat([name, address, locations0, locations1, locations2, age, height, floor, rent, admin, others, floor_plan, area], axis=1)

#カラム名
suumo_df.columns=['マンション名','住所','立地1','立地2','立地3','築年数','建物高さ','階','賃料','管理費', '敷/礼/保証/敷引,償却','間取り','専有面積']

#csvファイルとして保存
suumo_df.to_csv('suumo_adachi.csv', sep = '\t',encoding='utf-16')

python

で実行すると

pages_split3 = int(pages_split2)
ValueError: invalid literal for int() with base 10: 'v]'

というエラーが怒ってしまいます
intに文字列が入れれないところまでは
googleで調べてわかったのですが、
その後の対応策がわかりません。
どなたかわかる方いましたら教えてください!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

まずエラーが発生する箇所までで動作するかチェックしてみましょう。
ライブラリのversion等の環境の差で発生しているエラーがあるかもしれません。

from bs4 import BeautifulSoup
import requests
import pandas as pd
from pandas import Series, DataFrame
import time

# URL(東京都足立区の賃貸住宅情報 検索結果の1ページ目)
url = 'http://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=030&bs=040&ta=13&sc=13121&cb=0.0&ct=9999999&et=9999999&cn=9999999&mb=0&mt=9999999&shkr1=03&shkr2=03&shkr3=03&shkr4=03&fw2=&srch_navi=1'

# データ取得
result = requests.get(url)
c = result.content

# HTMLを元に、オブジェクトを作る
soup = BeautifulSoup(c, "html.parser")

# 物件リストの部分を切り出し
summary = soup.find("div", {'id': 'js-bukkenList'})

# ページ数を取得
body = soup.find("body")
pages = body.find_all("div", {'class': 'pagination pagination_set-nav'})
pages_text = str(pages)
pages_split = pages_text.split('</a></li>\n</ol>')
pages_split0 = pages_split[0]
pages_split1 = pages_split0[-3:]
pages_split2 = pages_split1.replace('>', '')
pages_split3 = int(pages_split2)
print(pages_split3)

また、teratailにコードを貼り付ける場合、下記を参照して貼り付けるようにしてください。
ただのテキストのままではコードの間違いをチェックも難しくなります。
コードを入力の部分を参照してください

投稿 2017/11/23 12:40

編集 2017/11/23 13:08

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/23 13:19

    wakame様
    ご解答いただきありがとうございました

    ご返信いただいた、
    まずエラーが発生する箇所までで動作するかチェックしてみましょう。
    ライブラリのversion等の環境の差で発生しているエラーがあるかもしれません。
    のコードを実行すると、

    ファイル名の後に、
    on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    というエラーが発生しました。

    キャンセル

  • 2017/11/23 13:26

    wakame様
    ご返信いただいた中で、ライブラリのversion等の環境の差で
    というご意見を頂いたので、
    必要かどうかわかりませんが、
    terminalからpip freezeで出した
    情報も貼り付けさせていただきます。

    BeautifulSoup==3.2.1
    beautifulsoup4==4.6.0
    bs4==0.0.1
    certifi==2017.11.5
    chainer==3.1.0
    chardet==3.0.4
    Cython==0.27.3
    filelock==2.0.13
    idna==2.6
    numpy==1.13.3
    pandas==0.21.0
    protobuf==3.5.0
    python-dateutil==2.6.1
    pytz==2017.3
    requests==2.18.4
    scipy==1.0.0
    six==1.11.0
    urllib3==1.22
    You are using pip version 8.1.1, however version 9.0.1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.

    キャンセル

  • 2017/11/23 13:34

    すみません、
    非常に初歩的な質問で申し訳ありませんが、
    $ python ファイル
    $ python3 ファイル
    どちらでの起動が正しいでしょうか

    キャンセル

  • 2017/11/23 13:35

    $ python3 ファイルだと
    218が返ってきました

    キャンセル

  • 2017/11/23 13:43 編集

    $ python -V と $ python3 -Vをするとどのような結果が返ってきますか?おそらくpython2と3が共存している環境だと思いますが・・・確認のため。

    キャンセル

  • 2017/11/23 13:52

    $ python -V だと
    SyntaxError: Non-ASCII character '\xef' in file /Users/M/INBOX/python/機械学習を使って東京23区のお買い得賃貸物件を探してみた - データで見る世界/1.スクレイピング編/test2.py on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details


    $ python3 -V だと
    218が返ってきてきました。

    キャンセル

  • 2017/11/23 13:56

    引数にファイル(ソースコード)は必要ありません、$ python -V 、 $ python3 -V のみ入力してもらえますか。ちなみに今やろうとしていることはpythonのversion情報を表示させようとしています。

    キャンセル

  • 2017/11/23 14:01

    失礼しました。
    $ python -V だと、
    Python 2.7.12

    $ python3 -V だと、
    Python 3.5.2
    でした。

    キャンセル

  • 2017/11/23 14:10 編集

    なるほど、やはりpython2と3が混在している環境なんですね。引用元のソースコードがpython3で正常に動作するということはpython3で動作確認されたコードのようですね。

    キャンセル

  • 2017/11/23 14:13

    丁寧なご解答ありがとうございます。
    wakame様にはお手数おかけしますが、
    この先のやり方について教えていただけませんか?

    キャンセル

  • 2017/11/23 14:18

    python3で正常に動作するとわかったならば、まず$python3 ファイル名(ソースコード)を実行してどうなるかを確認してみるではないでしょうか。その後また不明点、わからないことがあったらこの質問とは別の質問で聞いてみるといいと思います。

    キャンセル

  • 2017/11/23 14:28

    かしこまりました!

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

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

  • Python

    3812questions

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