import requests
import bs4

"""
Explanation: 4.2 サードパーティ製パッケージを使ってスクレイピングに挑戦

Requests http://docs.python-requests.org/
Beautiful Soup http://www.crummy.com/software/BeautifulSoup/
End of explanation
"""


# Requestsでgihyo.jpのページのデータを取得
import requests
r = requests.get('http://gihyo.jp/lifestyle/clip/01/everyday-cat')
r.status_code # ステータスコードを取得

r.text[:50] # 先頭50文字を取得

"""
Explanation: RequestsでWebページを取得
End of explanation
"""


# JSON形式のAPIレスポンスを取得
r = requests.get('https://connpass.com/api/v1/event/?keyword=python')
data = r.json() # JSONをデコードしたデータを取得
for event in data['events']:
    print(event['title'])

# 各種HTTPメソッドに対応
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data=payload)
r = requests.put('http://httpbin.org/put', data=payload)
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')

# Requestsの便利な使い方
r = requests.get('http://httpbin.org/get', params=payload)
r.url

r = requests.get('https://httpbin.org/basic-auth/user/passwd', auth=('user', 'passwd'))
r.status_code

"""
Explanation: Requestsを使いこなす

connpass APIリファレンス https://connpass.com/about/api/
End of explanation
"""


# Beautiful Soup 4で「技評ねこ部通信」を取得
import requests
from bs4 import BeautifulSoup
r = requests.get('http://gihyo.jp/lifestyle/clip/01/everyday-cat')
soup = BeautifulSoup(r.content, 'html.parser')
title = soup.title # titleタグの情報を取得
type(title) # オブジェクトの型は Tag 型

print(title) # タイトルの中身を確認
print(title.text) # タイトルの中のテキストを取得

# 技評ねこ部通信の1件分のデータを取得
div = soup.find('div', class_='readingContent01')
li = div.find('li') # divタグの中の最初のliタグを取得
print(li.a['href']) # liタグの中のaタグのhref属性の値を取得
print(li.a.text) # aタグの中の文字列を取得
li.a.text.split(maxsplit=1) # 文字列のsplit()で日付とタイトルに分割

# 技評ねこ部通信の全データを取得
div = soup.find('div', class_='readingContent01')
for li in div.find_all('li'): # divタグの中の全liタグを取得
    url = li.a['href']
    date, text = li.a.text.split(maxsplit=1)
    print('{},{},{}'.format(date, text, url))

"""
Explanation: httpbin(1): HTTP Client Testing Service https://httpbin.org/

Beautiful Soup 4でWebページを解析
End of explanation
"""


# タグの情報を取得する
div = soup.find('div', class_='readingContent01')
type(div) # データの型はTag型

div.name

div['class']

div.attrs # 全属性を取得

# さまざまな検索方法
a_tags = soup.find_all('a') # タグ名を指定
len(a_tags)

import re
for tag in soup.find_all(re.compile('^b')): # 正規表現で指定
    print(tag.name)

for tag in soup.find_all(['html', 'title']): # リストで指定
    print(tag.name)

# キーワード引数での属性指定
tag = soup.find(id='categoryNavigation') # id属性を指定して検索
tag.name, tag.attrs

tags = soup.find_all(id=True) # id属性があるタグを全て検索
len(tags)

div = soup.find('div', class_='readingContent01') # class属性はclass_と指定する
div.attrs

div = soup.find('div', {'class': 'readingContent01'}) # 辞書形式でも指定できる
div.attrs

# CSSセレクターを使用した検索
soup.select('title') # タグ名を指定

tags = soup.select('body a') # body タグの下のaタグ
len(a_tags)

a_tags = soup.select('p > a') # pタグの直下のaタグ
len(a_tags)

soup.select('body > a') # bodyタグの直下のaタグは存在しない

div = soup.select('.readingContent01') # classを指定
div = soup.select('div.readingContent01')
div = soup.select('#categoryNavigation') # idを指定
div = soup.select('div#categoryNavigation')
a_tag = soup.select_one('div > a') # 最初のdivタグ直下のaタグを返す

"""
Explanation: Beautiful Soup 4を使いこなす
End of explanation
"""


