カテゴリー別アーカイブ: Python

Python 3.x 系のrequestsモジュールをインストールする

$ pip install requests

では, Python 2.x 系のrequestsモジュールがインストールされてしまいます. したがって, これでは, Python 3.x 系からはrequestsモジュールが利用できません.

$ python3 -m easy_install pip
$ pip install requests

とすれば, Python 3.x 系のrequestsモジュールがインストールできます.

Python Beautiful Soup 4

こんな感じでHTMLのパースが可能です.

$ python
Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> from bs4 import BeautifulSoup
>>> res = requests.get('http://gihyo.jp/')
>>> soup = BeautifulSoup(res.text, 'lxml')
>>> print(soup)

Python lxmlモジュール

Pythonのrequestsモジュールを利用することで, HTTPクライアントプログラムを簡単に実装できます.

まずは, requestsモジュールをインストールします.

$ (sudo) easy_install pip
$ (sudo) pip install lxml

パースする場合,

$ python
Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> try:
>>>     from lxml import etree
>>> except ImportError:
>>>    import xml.etree.ElementTree as etree
>>> res = requests.get('http://rss.rssad.jp/rss/gihyo/feed/atom')
>>> open('gihyo.xml', 'wb').write(res.content)
>>> tree = etree.parse('gihyo.xml')
>>> root = tree.getroot()
>>> print(root.tag)
{http://www.w3.org/2005/Atom}feed
>>> for child in root:
...     print(child)
...
<Element {http://www.w3.org/2005/Atom}title at 0x10c22fa28>
<Element {http://www.w3.org/2005/Atom}subtitle at 0x10c22f170>
<Element {http://www.w3.org/2005/Atom}id at 0x10c22fe18>
<Element {http://www.w3.org/2005/Atom}link at 0x10c22fa28>
<Element {http://www.w3.org/2005/Atom}author at 0x10c22f998>
<Element {http://www.w3.org/2005/Atom}updated at 0x10c22f170>
<Element {http://www.w3.org/2005/Atom}rights at 0x10c22fe18>
<Element {http://www.w3.org/2005/Atom}icon at 0x10c22f998>
<Element {http://www.w3.org/2005/Atom}link at 0x10c22fa28>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f170>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fe18>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f998>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fa28>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f170>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fe18>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f998>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fa28>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f170>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fe18>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f998>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fa28>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f170>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fe18>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f998>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fa28>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f170>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fe18>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22f998>
<Element {http://www.w3.org/2005/Atom}entry at 0x10c22fa28>
>>> link = root.find("{http://www.w3.org/2005/Atom}link")
>>> print(link.attrib)
{'href': 'http://gihyo.jp/'}
>>> root = etree.fromstring(res.text.encode('utf-8'))
>>> print(root)
<Element {http://www.w3.org/2005/Atom}feed at 0x10c2302d8>

作成する場合,

>>> nsmap = {None: 'http://www.w3.org/2005/Atom'}
>>> new_elem = etree.Element('feed', nsmap=nsmap)
>>> sub1 = etree.SubElement(new_elem, 'title')
>>> sub1.text = 'my test feed'
>>> sub2 = etree.Element('link', attrib={'href': 'http://gihyo.jp'})
>>> new_elem.append(sub2)
>>> print(etree.tounicode(new_elem, pretty_print=True))
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>my test feed</title>
    <link href="http://gihyo.jp"/>
</feed>

Python requestsモジュール

Pythonのrequestsモジュールを利用することで, HTTPクライアントプログラムを簡単に実装できます.

まずは, requestsモジュールをインストールします.

$ (sudo) easy_install pip
$ (sudo) pip install requests

例えば, GETメソッドを利用する場合,

$ python
Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> res = requests.get('http://gihyo.jp')
>>> print(res.status_code == requests.codes.ok)
True
>>>

requestsモジュール

Python ループ

for

インデントでブロックを表現するのはもちろんですが, else: というのもなかなか他の言語では見当たらない構文です.

これはループが終了したときに実行したい処理を記述します (ただし, break文でループを終了した場合は実行されません).

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in ['apple', 'orange', 'lemon']:
...     print(i)
... 
apple
orange
lemon
>>> for i in range(5):
...     print(i)
... 
0
1
2
3
4
>>> for index, name in enumerate(['apple', 'orange', 'lemon']):
...     print(index, name)
... 
0 apple
1 orange
2 lemon
>>> for i in range(3):
...     print(i)
... else:
...     print('done')
... 
0
1
2
done
>>> for i in range(0):
...     print(i)
... else:
...     print('done')
... 
done
>>> for i in range(1, 4):
...     print(i)
...     if i == 2:
...         break
... else:
...     print('loop end')
... 
1
2

while

whileは他のプログラミング言語と同様に不定回数のループに利用します. 基本的な考え方は他のプログラミング言語と同様です. つまり, 条件が真の間ループが継続します.

また, forと同様にelseでループが終了した場合の処理を記述することが可能です.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> done = False
>>> while not done:
...     echo_text = input('echo > ')
...     if echo_text == 'done':
...         done = True
...     else:
...         print(echo_text)
... else:
...     print('done')
... 
echo > Hello World !!
Hello World !!
echo > Hello Python !!
Hello Python !!
echo > done
done
>>>

Python 条件文

Pythonの特徴の1つと言えるのが, インデントによってブロックを表すことです.

例えば, JavaScriptの場合,

if (1) {
    console.log('true')
}

となりますが, Pythonでは {} の部分をインデントで表現します.

if 1:
    print('True')
True

また, 偽の場合の処理はelseブロックに, さらに条件文が必要な場合はelifブロックに記述します.

if False:
    print('False')
elif 1:
    print('1')
elif 0:
    print('0')
else:
    print('True')

Python 辞書型 (Dictionaries)

キーと値を対応させたデータ型はPythonではマップ型と呼ばれ(Javaのハッシュマップや, PHPの連想配列, JavaScriptのプレインオブジェクトなど), そのうちの1つとして辞書型 (Dictionaries) があります.

辞書型は,

  • ミュータブル
  • 順序性は保証されない
$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {'key1' : 'value1', 'key2' : 'value2', 'key3' : 'value3'}  # 辞書型変数の定義
>>> d['key1']  # 値の参照
'value1'
>>> d['key2']  # 値の参照
'value2'
>>> d['key4']  # 値の参照
Traceback (most recent call last):
  File "", line 1, in 
KeyError: 'key4'
>>> 'key1' in d  # キーの存在チェック
True
>>> 'key4' in d  # キーの存在チェック
False
>>> d.get('key1')  # キーの存在チェック & 値の参照
'value1'
>>> d.get('key4')  # キーの存在チェック & 値の参照
>>> d.get('key4', 'default')  # キーの存在チェック & 値の参照
'default'
>>> for key in d:  # キーのイテレーション
...     print(key)
key3
key1
key2
>>> for value in d.values():  # 値のイテレーション
...     print(value)
value3
value1
value2
>>> for key, value in d.items():  # キーと値のイテレーション
...     print(key, value)
key3 value3
key1 value1
key2 value2
>>> d['key1'] = 'newValue1'  # 値の更新
>>> d['key1']
'newValue1'
>>> del d['key1']  # キー (と値) の削除
>>> d
{'key3': 'value3', 'key2': 'value2'}
>>> d.pop('key2')  # キー (と値) の削除と削除した値の参照
'value2'
>>> d
{'key3': 'value3'}

Python セット (set)

setは数学の集合の概念をプログラミングの世界に取り入れたもので, ユニークなオブジェクトの集まりをもったオブジェクとです.

したがって, 同じオブジェクトを複数回追加しても内容は変化しません. また, 順序性も保持しません.

setの生成で注意が必要なのは, 「ユニークである」ということをハッシュ値を利用して判別していることです. したがって, listのようなハッシュ化できないオブジェクトを格納することはできません.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> s = {1, 2, 3.0, 'a', 'bc'}
>>> s
{'bc', 1, 2, 3.0, 'a'}
>>> s = set([1, 2, 3.0, 'a', 'bc'])
>>> s
{'bc', 1, 2, 3.0, 'a'}
>>> s = {[1, 2, 3.0], 'a', 'bc'}
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'list'

セットのオペレーション

要素の追加と削除

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> s = {1, 2, 'abc'}
>>> s.add(3.0)
>>> s
{'abc', 1, 2, 3.0}
>>> s.remove(3.0)
>>> s
{'abc', 1, 2}
>>> s.remove(3)
Traceback (most recent call last):
  File "", line 1, in 
KeyError: 3
>>> s.discard(2)
>>> s
{'abc', 1}
>>> s.discard(2)
>>> s
{'abc', 1}

イテレーション

listのようにfor . . . in … 文でイテレーション可能ですが, 順序性が保証されないことに注意してください.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> s = {1, 2, 3.0, 'abc'}
>>> for item in s:
...     print(item)
abc
1
2
3.0

ユニオン (Union 和集合)

unionメソッドを利用することで, 2つ以上のsetの和集合をとることが可能です.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> set1 = {7, 9, 2}
>>> set2 = {18, 22, 3, 7, 12}
>>> set1.union(set2)
{2, 3, 7, 9, 12, 18, 22}
>>> set3 = {11, 6, 9, 15}
>>> set1.union(set2, set3)
{2, 3, 6, 7, 9, 11, 12, 15, 18, 22}

インターセクション (Intersection 積集合)

intersectionメソッドを利用することで, 2つ以上のsetの積集合をとることが可能です.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> set1 = {7, 9, 2}
>>> set2 = {18, 22, 3, 7, 12, 9}
>>> set3 = {11, 7, 3, 6, 9, 15}
>>> set1.intersection(set2, set3)
{9, 7}

ディファレンス (Difference 差集合)

differenceメソッドを利用することで, 2つ以上のsetの差集合をとることが可能です. 差集合なので, setの指定順によって, 結果のsetが異なることに注意してください.

また, symmetric_differenceメソッドを利用することで, 両方には含まれていない要素のsetを抽出することも可能です. こちらは, setの指定順に関係なく結果のsetは常に同じです.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> set1 = {7, 9, 2}
>>> set2 = {18, 22, 3, 7, 12, 9}
>>> set1.difference(set2)
{2}
>>> set2.difference(set1)
{18, 3, 12, 22}
>>> set1 = {18, 22, 3, 7, 12, 9}
>>> set2 = {7, 9, 2}
>>> set3 = {11, 7, 3, 6, 9, 15}
>>> set1.difference(set2, set3)
{18, 12, 22}
>>> set1 = {18, 22, 3, 7, 12, 9}
>>> set2 = {7, 9, 2}
>>> set1.symmetric_difference(set2)
{2, 3, 12, 18, 22}
>>> set2.symmetric_difference(set1)
{18, 3, 2, 22, 12}