‘ascii’ codec can’t encode characters と表示されたとき

import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen("https://www.monex.co.jp/")
soup = BeautifulSoup(html, "html.parser")
tag =soup.title.string
print(tag)

エンコードできないと表示された。
[vagrant@localhost python]$ python app.py
Traceback (most recent call last):
File “app.py”, line 9, in
print(tag)
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-6: ordinal not in range(128)

こうなったら、タグを正規表現でreplaceしようと試したが上手くいかず、イライラMaxで数時間就寝。
改めて、試したら

import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen("https://www.monex.co.jp/")
soup = BeautifulSoup(html, "html.parser")
tag =soup.title.string
print(tag.encode("utf-8"))

なんだ、エンコードを指定するのね♪
[vagrant@localhost python]$ python app.py
マネックス証券 | ネット証券(株・アメリカ株・投資信託)

大体気分転換すると上手くいくね。

beautiful soup4をインストールしよう

pipでbeautifulsoup4を入れます。

[vagrant@localhost python]$ pip install beautifulsoup4
Collecting beautifulsoup4
Downloading https://files.pythonhosted.org/packages/a6/29/bcbd41a916ad3faf517780a0af7d0254e8d6722ff6414723eedba4334531/beautifulsoup4-4.6.0-py2-none-any.whl (86kB)
100% |################################| 92kB 186kB/s
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the ‘pip install –upgrade pip’ command.

おおおお、入ったようだ。

ん、どうやら、python3系のコードを書いてしまったよう。
python app.py
Traceback (most recent call last):
File “app.py”, line 3, in
import requests, bs4
ImportError: No module named requests

やり直します。

import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen("https://www.monex.co.jp/")
soup = BeautifulSoup(html)

[vagrant@localhost python]$ python app.py
/home/linuxbrew/.linuxbrew/Cellar/python@2/2.7.14_4/lib/python2.7/site-packages/bs4/__init__.py:181: UserWarning: No parser was explicitly specified, so I’m using the best available HTML parser for this system (“html.parser”). This usually isn’t a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

The code that caused this warning is on line 7 of the file app.py. To get rid of this warning, change code that looks like this:

BeautifulSoup(YOUR_MARKUP})

to this:

BeautifulSoup(YOUR_MARKUP, “html.parser”)

markup_type=markup_type))

html.prserが必要のようですね。

soup = BeautifulSoup(html, "html.parser")

これでOK

では、社長が大好きなマネックス(https://www.monex.co.jp/)を見てみましょう。

import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen("https://www.monex.co.jp/")
soup = BeautifulSoup(html, "html.parser")

tag = soup.find("title")
print(tag)

おおおおおおおおおおおおおおおおおお、
ちゃんとスクレイピングできてます!

[vagrant@localhost python]$ python app.py
マネックス証券 | ネット証券(株・アメリカ株・投資信託)

import SimpleHTTPServer

SimpleHTTPServerをimportする。

[vagrant@localhost python]$ python
Python 2.7.14 (default, Mar 12 2018, 22:03:33)
[GCC 5.4.0 20160609] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import SimpleHTTPServer
>>> SimpleHTTPServer.test()
Serving HTTP on 0.0.0.0 port 8000 …
192.168.33.1 – – [21/Jul/2018 22:28:14] “GET / HTTP/1.1” 200 –
192.168.33.1 – – [21/Jul/2018 22:28:14] code 404, message File not found
192.168.33.1 – – [21/Jul/2018 22:28:14] “GET /favicon.ico HTTP/1.1” 404 –
192.168.33.1 – – [21/Jul/2018 22:28:18] “GET /app.py HTTP/1.1” 200 –

ん?どういうことだ?

pythonに慣れよう9 クラス

class Yamanote:
	pass

shinagawa = Yamanote()
shinagawa.city = "Minato-ku"
shinagawa.user = 370000
shinagawa.line = 24

shibuya = Yamanote()
shibuya.city = "Shibuya-ku"
shibuya.user = 3310000
shibuya.spot = "hachiko"

print(shinagawa.city)
print(shibuya.spot)

[vagrant@localhost python]$ python app.py
Minato-ku
hachiko

コンストラクタを使う。

class Yamanote:
	def __init__(self, city):
		self.city = city

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")

print(shinagawa.city)
print(shibuya.city)

[vagrant@localhost python]$ python app.py
Shinagawa-ku
Shibuya-ku

クラス変数を呼び出す。

class Yamanote:
	count = 0
	def __init__(self, city):
		Yamanote.count += 1
		self.city = city

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")
print(Yamanote.count)

ふむ。
[vagrant@localhost python]$ python app.py
2

メソッド

class Yamanote:
	count = 0
	def __init__(self, city):
		Yamanote.count += 1
		self.city = city
	def announce(self):
		print("This is " + self.city)

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")

shinagawa.announce()
shibuya.announce()

わかるんだが、使っていかないと、慣れないね。
[vagrant@localhost python]$ python app.py
This is Shinagawa-ku
This is Shibuya-ku

@classmethod

class Yamanote:
	count = 0
	def __init__(self, city):
		Yamanote.count += 1
		self.city = city
	def announce(self):
		print("This is " + self.city)
	@classmethod
	def show_info(cls):
		print(str(cls.count) + "instances")

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")

Yamanote.show_info()

あああああ
[vagrant@localhost python]$ python app.py
2instances

class のprivate, public

class Yamanote:
	def __init__(self, city):
		self.__city = city
	def announce(self):
		print("This is " + self.__city)

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")

print(shinagawa.__city)

[vagrant@localhost python]$ python app.py
Traceback (most recent call last):
File “app.py”, line 12, in
print(shinagawa.__city)
AttributeError: Yamanote instance has no attribute ‘__city’
ほえ~

継承のsuperがうまくいかない。

class Yamanote:
	def __init__(self, spot):
		self.spot = spot
	def announce(self):
		print("Enjoy " + self.spot)

class Startup(Yamanote):
	def __init__(self, spot, company):
		super().__init__(spot)
		self.company = company
	def hello(self):
		print("What's up " + self.company)

harajyuku = Startup("takeshita","sm")
print(Harajyuku.spot)
Harajyuku.hello()

[vagrant@localhost python]$ python app.py
Traceback (most recent call last):
File “app.py”, line 16, in
harajyuku = Startup(“takeshita”,”sm”)
File “app.py”, line 11, in __init__
super().__init__(spot)
TypeError: super() takes at least 1 argument (0 given)
あ、python2系はエラーになるのね。。早くいってよ、もー

import math, random
print(math.pi)

pythonに慣れよう8 変数のスコープ

関数の中で変数を定義する。

def yurakucho_line():
		dep = "nagatacho"
		arrive = "yurakucho"
		print(dep + " + " +arrive)

yurakucho_line()

[vagrant@localhost python]$ python app.py
nagatacho + yurakucho

グローバルな変数

dep = "東京駅"
def yurakucho_line():
		dep = "永田町"
		arrive = "有楽町"
		print(dep + " → " +arrive)
yurakucho_line()
print(dep + "を出発しました。")

[vagrant@localhost python]$ python app.py
永田町 → 有楽町
東京駅を出発しました。

変数の中をコメントアウトする。

def yurakucho_line():
		# dep = "永田町"
		arrive = "有楽町"
		print(dep + " → " +arrive)
yurakucho_line()
print(dep + "を出発しました。")

[vagrant@localhost python]$ python app.py
東京駅 → 有楽町
東京駅を出発しました。

pythonに慣れよう7 関数

defを使います。

coffee = raw_input("注文 ? ")
def cheer():
	print("いらっしゃいませ。ご注文はお決まりでしょうか?")

def order():
	print(coffee + "をお願いします。")

def thanks():
	print(coffee + "ですね。少々お待ちくださいませ。")

cheer()
order()
thanks()

[vagrant@localhost python]$ python app.py
注文 ? orange
いらっしゃいませ。ご注文はお決まりでしょうか?
orangeをお願いします。
orangeですね。少々お待ちくださいませ。

引数を渡します。

def order(coffee):
	print("いらっしゃいませ。ご注文はお決まりでしょうか?")
	print(coffee + "をお願いします。")
	print(coffee + "ですね。少々お待ちくださいませ。")

order("ブレンド")
order("カフェラテ")
order("カフェモカ")

ルノアールでも大体こんな感じ。
[vagrant@localhost python]$ python app.py
いらっしゃいませ。ご注文はお決まりでしょうか?
ブレンドをお願いします。
ブレンドですね。少々お待ちくださいませ。
いらっしゃいませ。ご注文はお決まりでしょうか?
カフェラテをお願いします。
カフェラテですね。少々お待ちくださいませ。
いらっしゃいませ。ご注文はお決まりでしょうか?
カフェモカをお願いします。
カフェモカですね。少々お待ちくださいませ。

引数を注文と支払金額にアレンジしてみます。

brend = 380
cafelate = 420
cafemoca = 480

def order(coffee, money):
	print("いらっしゃいませ。ご注文はお決まりでしょうか?")
	print(coffee + "をお願いします。")
	print(coffee + "ですね。少々お待ちくださいませ。")
	if coffee == "ブレンド":
		print(str(brend) + "円になります。")
		print(str(money) + "円でお願いします。")
		print(str(money - brend) + "円のお返しになります。ありがとうございました。")
	elif coffee == "カフェラテ":
		print(str(cafelate) + "円になります。")
		print(str(money) + "円でお願いします。")
		print(str(money - brend) + "円のお返しになります。ありがとうございました。")
	elif coffee == "カフェモカ":
		print(str(cafemoca) + "円になります")
		print(str(money) + "円でお願いします。")
		print(str(money - brend) + "円のお返しになります。ありがとうございました。")
	else:
		print("申し訳ございません。" + coffee + "は当店にはございません。")

order("ブレンド", 500)
order("カフェラテ", 1000)
order("カフェモカ", 10000)
order("ブルーマウンテン", 1000)

やる気のない定員は大体こんなワンパターン。
[vagrant@localhost python]$ python app.py
いらっしゃいませ。ご注文はお決まりでしょうか?
ブレンドをお願いします。
ブレンドですね。少々お待ちくださいませ。
380円になります。
500円でお願いします。
120円のお返しになります。ありがとうございました。
いらっしゃいませ。ご注文はお決まりでしょうか?
カフェラテをお願いします。
カフェラテですね。少々お待ちくださいませ。
420円になります。
1000円でお願いします。
620円のお返しになります。ありがとうございました。
いらっしゃいませ。ご注文はお決まりでしょうか?
カフェモカをお願いします。
カフェモカですね。少々お待ちくださいませ。
480円になります
10000円でお願いします。
9620円のお返しになります。ありがとうございました。
いらっしゃいませ。ご注文はお決まりでしょうか?
ブルーマウンテンをお願いします。
ブルーマウンテンですね。少々お待ちくださいませ。
申し訳ございません。ブルーマウンテンは当店にはございません。

関数はreturnして値を返すこともできる。PassはNoneです。

def deeplearning():
	return "DNN, CNN, RNN"
def conputerVision():
	return "画像認識"

msg = deeplearning()
print(msg)

[vagrant@localhost python]$ python app.py
DNN, CNN, RNN

pythonに慣れよう6 for文

printする際に、iをstr(i)としないと、 cannot concatenate ‘str’ and ‘int’ objectsとエラーになる。

list = ["井山裕太","許家元","一力遼","山下敬吾","余正麒"]

j = 0
for i in range(5, 0, -1):
	print("第" + str(i) + "位:" + list[j])
	j += 1

[vagrant@localhost python]$ python app.py
第5位:井山裕太
第4位:許家元
第3位:一力遼
第2位:山下敬吾
第1位:余正麒

途中にif文を差し込むと

j = 0
for i in range(5, 0, -1):
	print("第" + str(i) + "位:" + list[j])
	if i == 2:
		print("ざわざわ")
	j += 1

[vagrant@localhost python]$ python app.py
第5位:井山裕太
第4位:許家元
第3位:一力遼
第2位:山下敬吾
ざわざわ
第1位:余正麒

j = 0
for i in range(5, 0, -1):
	if i == 2:
		print("ざわざわ")
		continue
	print("第" + str(i) + "位:" + list[j])
	j += 1

スキップされます
[vagrant@localhost python]$ python app.py
第5位:井山裕太
第4位:許家元
第3位:一力遼
ざわざわ
第1位:山下敬吾

pythonに慣れよう5

配列を使ってwhile文

# coding: utf-8
list = ["王将","飛車","角行","金将","銀将","桂馬","香車","歩兵"]
num = len(list)

i = 0
while i < num:
	print(list[i])
	i += 1
else:
	print("end")

[vagrant@localhost python]$ python app.py
王将
飛車
角行
金将
銀将
桂馬
香車
歩兵
end

while文の途中でbreakを入れる場合は

i = 0
while i < num:
	if list[i] == "桂馬":
		print("あとは雑魚")
		break
	print(list[i])
	i += 1
else:
	print("end")

なるほど
[vagrant@localhost python]$ python app.py
王将
飛車
角行
金将
銀将
あとは雑魚

range
以下のように書くと、10 9 8 .. 2 1 0となるかと思ったが、何も表示されない。rangeは足す時だけのようね。

for i in range(10, 0):
	print(i)
for i in range(0, 10):
	print(i)

あーはいはい、こういうことね。そりゃ出来ない訳ないよね♪

for i in range(10, 0, -1):
	print(i)

[vagrant@localhost python]$ python app.py
10
9
8
7
6
5
4
3
2
1

pythonに慣れよう4

pythonのif文を麻雀の役の計算で書いてみる。

chair = "parent"
yaku = int(input("yaku ? "))

if yaku == 1:
	print("lon, 2000")
elif yaku == 2:
	print("lon, 3900")
elif yaku == 3:
	print("lon, 7700")
elif yaku < 6:
	print("mangan, 12000")
elif yaku < 8:
	print("haneman, 18000")
elif yaku < 11:
	print("baiman, 24000")
elif yaku < 13:
	print("sanbaiman, 36000")
else:
	print("48000, shuryodesu")
&#91;/python&#93;

&#91;vagrant@localhost python&#93;$ python app.py
yaku ? 6
haneman, 18000
yaku ? 24
48000, shuryodesu

ifを入れ子にする場合。インデントでずらす。
&#91;python&#93;
chair = "child"
yaku = int(input("yaku ? "))

if chair == "parent":
	if yaku == 1:
		print("lon, 2000")
	elif yaku == 2:
		print("lon, 3900")
	elif yaku == 3:
		print("lon, 7700")
	elif yaku < 6:
		print("mangan, 12000")
	elif yaku < 8:
		print("haneman, 18000")
	elif yaku < 11:
		print("baiman, 24000")
	elif yaku < 13:
		print("sanbaiman, 36000")
	else:
		print("48000, shuryodesu")
elif chair == "child":
	if yaku == 1:
		print("lon, 1500")
	elif yaku == 2:
		print("lon, 2900")
	elif yaku == 3:
		print("lon, 5800")
	elif yaku < 6:
		print("mangan, 8000")
	elif yaku < 8:
		print("haneman, 12000")
	elif yaku < 11:
		print("baiman, 18000")
	elif yaku < 13:
		print("sanbaiman, 24000")
	else:
		print("36000, shuryodesu")
else:
	print("see you again")
&#91;/python&#93;

&#91;vagrant@localhost python&#93;$ python app.py
yaku ? 4
mangan, 8000

Yes sir!

改行せずに1行で書くこともできる。
&#91;python&#93;
chair = "child"
yaku = int(input("yaku ? "))

print("tobimashita" if yaku > 4 else "I'm winner")

while文

i = 1
while i < 29: print("2月{0}日".format(i)) i += 1 [/python]

pythonに慣れよう3

# coding: utf-8
name = "Gennadiy"
skill = "3D modeling"
location = "West Hollywood, Russia"

print("name: %s, skill: %s, location: %s" % (name, skill, location))

[vagrant@localhost python]$ python app.py
name: Gennadiy, skill: 3D modeling, location: West Hollywood, Russia

この記法は、mysqlのset valueみたいですね。変数をstringからnumberに変えます。

# coding: utf-8
name = "Gennadiy"
skill = "3D modeling"
age = 18

print("name: %s, skill: %s, age: %d" % (name, skill, age))

[vagrant@localhost python]$ python app.py
name: Gennadiy, skill: 3D modeling, age: 18

%f はfloatになるので、コンパイルエラーになります。
Traceback (most recent call last):
File “app.py”, line 6, in
print(“name: %s, skill: %s, age: %f” % (name, skill, age))
TypeError: float argument required, not str

型指定しない記法もある。

print("name: {0}, skill: {1}, age: {2}".format(name, skill, age))