読者です 読者をやめる 読者になる 読者になる

oneshotlife-pythonのブログ

Pythonを好んで使っているプログラマです。Pythonこそが最強のプログラミング言語だと思っています。Pythonは使いやすいです。Pythonは書きやすいです。Pythonは読みやすいです。Pythonはパワフルです。Pythonは一貫性があります。Pythonが好きです。

PythonとbottlenoseでAmazon Product Advertising APIを使う。

WebAPI 外部モジュール

概要

Product Advertising APIについては、Product Advertising APIから。
基本的に上記の通りのルールでプログラムを書けばいいのだが、面倒臭い。

APIのラッパー的なものが既に作られているのであればそちらを使ったほうが早い。

プログラムもPerl,Python,Ruby,PHPなどいろいろあるが、好きなものを選べば良いと思う。

Pythonのライブラリではbottlenoseが使い易そうだったので使ってみた。

ちなみに、AWSAccessKeyId、AWSSecretKey、AssosiateIdなどの取得の方法は、省略する。。。
他に詳しく説明されている方がいるので各自でお調べを。

bottlenoseについて

インストール方法

pip install bottlenose

ItemLookupで商品情報をxml形式で取得する

ASINコードを元に検索する場合にこちらを使う。
ASINとはAmazonで使っているコードのこと。
書籍の場合はISBNとほぼ一緒。
参考に、ASIN:4873117569の情報を取得してみた。

サンプルコード
# -*- coding: cp932 -*-
import bottlenose
from bs4 import BeautifulSoup

AWSAccessKeyId="自分のIDを入れてね"
AWSSecretKey="自分のIDを入れてね"
AssosiateId = "自分のIDを入れてね"
amazon = bottlenose.Amazon(AWSAccessKeyId,
                           AWSSecretKey,
                           AssosiateId ,
                           Region='JP')

res = amazon.ItemLookup(ItemId="4873117569")
soup = BeautifulSoup(res,"lxml")

print soup.prettify()
実行結果(item要素のみ抜粋)
<?xml version="1.0" ?>
<html>
 <body>  
    <item>
     <asin>
      4873117569
     </asin>
     <detailpageurl>
      http://www.amazon.co.jp/Effective-Python-%E2%80%95Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%94%B9%E8%89%AF%E3%81%99%E3%82%8B59%E9%A0%85%E7%9B%AE-Brett-Slatkin/dp/4873117569%3FSubscriptionId%3DAKIAJGREZ6P3ZM45HYGQ%26tag%3Doneshotlifetom-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873117569
     </detailpageurl>
     <itemlinks>
      <itemlink>
       <description>
        Add To Wishlist
       </description>
       <url>
        http://www.amazon.co.jp/gp/registry/wishlist/add-item.html%3Fasin.0%3D4873117569%26SubscriptionId%3DAKIAJGREZ6P3ZM45HYGQ%26tag%3Doneshotlifetom-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D5143%26creativeASIN%3D4873117569
       </url>
      </itemlink>
      <itemlink>
       <description>
        Tell A Friend
       </description>
       <url>
        http://www.amazon.co.jp/gp/pdp/taf/4873117569%3FSubscriptionId%3DAKIAJGREZ6P3ZM45HYGQ%26tag%3Doneshotlifetom-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D5143%26creativeASIN%3D4873117569
       </url>
      </itemlink>
      <itemlink>
       <description>
        All Customer Reviews
       </description>
       <url>
        http://www.amazon.co.jp/review/product/4873117569%3FSubscriptionId%3DAKIAJGREZ6P3ZM45HYGQ%26tag%3Doneshotlifetom-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D5143%26creativeASIN%3D4873117569
       </url>
      </itemlink>
      <itemlink>
       <description>
        All Offers
       </description>
       <url>
        http://www.amazon.co.jp/gp/offer-listing/4873117569%3FSubscriptionId%3DAKIAJGREZ6P3ZM45HYGQ%26tag%3Doneshotlifetom-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D5143%26creativeASIN%3D4873117569
       </url>
      </itemlink>
     </itemlinks>
     <itemattributes>
      <author>
       Brett Slatkin
      </author>
      <creator role="監修">
       石本 敦夫
      </creator>
      <creator role="翻訳">
       黒川 利明
      </creator>
      <manufacturer>
       オライリージャパン
      </manufacturer>
      <productgroup>
       Book
      </productgroup>
      <title>
       Effective Python ―Pythonプログラムを改良する59項目
      </title>
     </itemattributes>
    </item>
   </items>
  </itemlookupresponse>
 </body>
</html>

xmlをパースする

beautifulsoupを使えば余裕で解析が出来る。

サンプルコード
soup = BeautifulSoup(res,"lxml")

dic = {}
dic["asin"] = soup.findAll("asin")[0].text
dic["detailpageurl"] = soup.findAll("detailpageurl")[0].text
dic["author"] = soup.findAll("author")[0].text
dic["title"] = soup.findAll("title")[0].text
dic["manufacturer"] = soup.findAll("manufacturer")[0].text
dic["productgroup"] = soup.findAll("productgroup")[0].text

for key,val in dic.iteritems():
    print "|",key,"|",val,"|"

最後に

WebAPIを使って情報を取得するのは楽しい。たいていの場合xmljsonで情報が取得出来るので、xmlとjosonのparseの仕方が分かれば余裕で情報が取得出来る。こういった構造化された情報を提供する人たちは、綺麗にデータを並べてくれているのが大半なので、HTMLをギコギコ解析するよりずっと簡単!

Pythonでデザインパターンを勉強するならこのサイトを見るといいよ。

応用

esu-ko.hatenablog.com
先日、教えてもらったのだが、もっと調べてみると、ウェブサイト上で公開している方がいましたね。

github.com
簡単に引用すると、以下のようなデザインパターンが、なんとPythonのサンプルコード付きで掲載されています。
が、全部英語ですので悪しからず。。。

英語も勉強せんとねー

Creational Patterns

Pattern Description
abstract_factory use a generic function with specific factories
borg a singleton with shared-state among instances
builder instead of using multiple constructors, builder object receives parameters and returns constructed objects
factory_method delegate a specialized function/method to create instances
lazy_evaluation lazily-evaluated property pattern in Python
pool preinstantiate and maintain a group of instances of the same type
prototype use a factory and clones of a prototype for new instances (if instantiation is expensive)

Structural Patterns

Pattern Description
3-tier data<->business logic<->presentation separation (strict relationships)
adapter adapt one interface to another using a white-list
bridge a client-provider middleman to soften interface changes
composite encapsulate and provide access to a number of different objects
decorator wrap functionality with other functionality in order to affect outputs
facade use one class as an API to a number of others
flyweight transparently reuse existing instances of objects with similar/identical state
front_controller single handler requests coming to the application
mvc model<->view<->controller (non-strict relationships)
proxy an object funnels operations to something else

Behavioral Patterns

Pattern Description
chain apply a chain of successive handlers to try and process the data
catalog general methods will call different specialized methods based on construction parameter
chaining_method continue callback next object method
command bundle a command and arguments to call later
mediator an object that knows how to connect other objects and act as a proxy
memento generate an opaque token that can be used to go back to a previous state
observer provide a callback for notification of events/changes to data
publish_subscribe a source syndicates events/data to 0+ registered listeners
registry keep track of all subclasses of a given class
specification business rules can be recombined by chaining the business rules together using boolean logic
state logic is organized into a discrete number of potential states and the next state that can be transitioned to
strategy selectable operations over the same data
template an object imposes a structure but takes pluggable components
visitor invoke a callback for all items of a collection

Others

Pattern Description
graph_search (graphing algorithms, not design patterns)

実践 Python 3

実践 Python 3

アルク英辞郎 on the Webのページをスクレイピングしてみた。 #Python #WebScraping

WebScraping

アルクのホームページ

www.alc.co.jp
はてぶが4000弱ってすごいですな。。。

英辞郎 on the Webについて

googleの検索窓みたいに、検索窓から検索要求を出すと、検索語の意味が返却されるようです。検索結果は、辞書とは比較にならないほど用例が多いです。複数のページに渡ることも多いので、出来れば複合語で検索して、検索結果を絞ったほうがよいでしょう。

サンプルコード

import requests
from bs4 import BeautifulSoup

def get_examples(word):
    base_url = "http://eow.alc.co.jp/search"
    query = {}
    query["q"] = word
    query["ref"] = "sa"
    ret = requests.get(base_url,params=query)
    text = ""
    soup = BeautifulSoup(ret.content,"lxml")
    for l in soup.findAll("div",{"id":"resultsList"})[0]:
        try:
            text += l.text
        except:
            pass
    return text

if __name__ == "__main__":
    ret = get_examples("Python")
    print ret

実行結果

python
【名】《動物》ニシキヘビ、錦蛇{にしきへび}、パイソン◆ニシキヘビ科(Pythonidae)のヘビの総称。アジア、アフリカ、オーストラリアに生息する大型のヘビで大きいものは6m以上になる。無毒で、獲物に巻き付いて窒息死させる。◆【語源】ギリシャ神話のピュトン(Python)から。〈俗〉ペニス【発音】páiθɑn、【@】パイソン、【変化】《複》pythons、【分節】py・thon



Python
【名】《ギリシャ神話》ピュトン◆デリュゲ(Deluge)が残した泥から産まれたヘビ(龍)。アポロ(Apollo)がデルフィ(Delphi)で退治した。《ギリシャ神話》ピュトン、世界大蛇{せかい だいじゃ}◆世界を一匹の大蛇(ボア)と考えていた。《python》予言霊{よげん れい}《動物》ニシキヘビ属



Python molurus
《動物》インドニシキヘビ◆学名



Python molurus bivittatus
《動物》ビルマニシキヘビ◆学名



Python regius
《動物》ボールニシキヘビ◆学名



Python reticulatus
《動物》アミメニシキヘビ◆学名



Python sebae
《動物》アフリカニシキヘビ◆学名



ball python
《動物》ボールニシキヘビ



Burmese python
《動物》ビルマニシキヘビ



carpet python
《動物》カーペットニシキヘビ◆オーストラリアに生息【表現パターン】carpet snake [python]



Monty Python
モンティ・パイソン◆イギリスのコメディ・グループ。BBC放送で1969年から1974年にかけて放映されたお笑い番組「Monty Python's Flying Circus」を製作・自演。日本では1976年に東京12チャンネル(現テレビ東京)で「空飛ぶモンティ・パイソン」というタイトルで放映された。



Monty Python And Now For Something Completely Different
【映画】モンティ・パイソン・アンド・ナウ◆英1975《監督》イアン・マクノートン《出演》グレアム・チャップマン、ジョン・クリーズ、エリック・アイドル、テリー・ジョーンズ、テリー・ギリアム、マイケル・パリン



reticulanus python
《動物》アミメニシキヘビ



rock python
ロックパイソン◆動物や鳥を食べる大ヘビ



siphon the python
〈俗〉〔男性が〕小便[おしっこ]をする



pythoness
【名】女性{じょせい}の神官{しんかん}、巫女{みこ}、女性{じょせい}の占い師、魔女{まじょ}



pythonic
【形】ニシキヘビの(ような)神託{しんたく}の(ような)



Pythonidae
【名】《動物》ニシキヘビ科



Monty Python's Life of Brian
【映画】モンティ・パイソン/ライフ・オブ・ブライアン◆英1979《監督》テリー・ジョーンズ《出演》グレアム・チャップマン、ジョン・クリーズ、テリー・ギリアム、エリック・アイドル、テリー・ジョーンズ、マイケル・パリン◆イエス・キリストの生涯をモンティ・パイソン風に料理したパロディ映画。製作総指揮にジョージ・ハリソンが参加している。



Monty Python's The Meaning of Life
【映画】モンティ・パイソン/人生狂騒曲◆英1983《監督》テリー・ジョーンズ《出演》グレアム・チャップマン、ジョン・クリーズ、テリー・ギリアム、エリック・アイドル、テリー・ジョーンズ、マイケル・パリン◆1984年のカンヌ映画祭で審査員特別賞を受賞した作品。なかでも、冒頭のテリー・ギリアムの短編映画「クリムゾン 老人は荒野を目指す」と、Every Sperm Is Sacredをフィーチャーしたミュージカル・シーンは大爆笑もの。

感想

タグ付けがぱっと見た感じ、構造化されていないのでスクレイピングがしずらかったです。。。

お薦め書籍

PythonによるWebスクレイピング

PythonによるWebスクレイピング

実践 Webスクレイピング&クローリング-オープンデータ時代の収集・整形テクニック

実践 Webスクレイピング&クローリング-オープンデータ時代の収集・整形テクニック

AmazonランキングのRSSをPythonで読み込んで出力 #Python

WebScraping

はじめに

最近、クローリング/スクレイピング/スパイダリングにはまっています。

Amazonのランキングを出力したいなと思いました。

やり方はいろいろあるのだけれども、、、
例えばAmazonのランキングのページのhtmlを解析して、必要な情報だけ抜き取るとかね。
このやり方の良いところは、ページに表示されているものならすべて扱えるところですかね。

他にもRSSを読み込んで出力するという方法があります。
RSSはフォーマッティングされた綺麗な形式なので、情報の抜きだしは簡単。その代わり、
配信されていない情報はどうにもこうにも出来ません。

ということで、扱いたい情報がRSSで事足りるならRSS,足りないならページを地道にスクレイピングするのが良いのかなと。

試しに

Amazon.co.jp: 本 > 文学・評論のベストセラー

RSSを読み込んでみることにしました。

サンプルコード

>>> import feedparser
>>> url = "http://www.amazon.co.jp/gp/rss/bestsellers/books/466284/"
>>> feed = feedparser.parse(url)
>>> for entry in feed["entries"]:
...     print entry["title"]
...

実行結果

#1: カエルの楽園
#2: 天才
#3: 黒蜥蜴
#4: 七つの会議 (集英社文庫)
#5: あの日
#6: 火星の人
#7: 夏を殺す少女
#8: 『嵐、ブレイク前夜』外伝 嵐、青春プレーバック
#9: 七つの会議
#10: 作家の収支 (幻冬舎新書)

簡単ですね!

応用も出来そう。

こういうことに興味をお持ちならこちらの書籍もどうぞ

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Pythonで文字列が空かどうかを判定するシンタックス #Python

基礎

文字列か空かどうかを判定する機会は多いので備忘録として残す。

サンプルコード

>>> str = ""
>>> type(str)
<type 'str'>
>>> len(str)
0
>>> not str
True
>>>

コメント

lenでサイズを調べる。空文字列であれば0が返却される。

>>> len(str)
0

notを使う。空文字列であればTrueが返却される。

>>> not str
True

Pythonで楽天ウェブサービスを使って書籍情報を取得する ~ リファクタリングしてみた #Python

WebAPI

はじめに

前回好評だったエントリPythonで楽天ウェブサービスを使って書籍情報を取得する #Python - oneshotlife-pythonのブログですが、Pythonの知識の浅い数年前に書いたコードだったため、つっこみどころ満載でした。よってリファクタリングしてみました。リファクタ
リングって流行ってるみたいですね。リファクタリング関連の書籍もたくさん出ています。中には、Rubyなどに言語を絞った書籍もあるようです。残念ながら、Pythonに絞ったリファクタリング本は未だ無いようです。

サンプルコード(リファクタリング前)

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import urllib
import urllib2
import json

def Rakuten_BooksAuthorSearch(author,hits,sort):
    developerId = 'DEV_ID'
    affiliateId = 'AFF_ID'
    uri = 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20130522?'+\
    'applicationId='   +developerId+\
    '&affiliateId='    +affiliateId+\
    '&author='          +author+\
    '&hits='            +hits+\
    '&sort='            +sort
    
    res = json.load(urllib2.urlopen(uri))
    print json.dumps(res, sort_keys = True, indent = 4)
    
    items = res["Items"]
    for item in items:
        print item["Item"]["title"]       
    print """<!-- Rakuten Web Services Attribution Snippet FROM HERE -->
<a href="http://webservice.rakuten.co.jp/" target="_blank">Supported by 楽天ウェブサービス</a>
<!-- Rakuten Web Services Attribution Snippet TO HERE -->"""

Rakuten_BooksAuthorSearch(urllib.quote("芥川龍之介"),"5","sales")

リファクタリングポイント

メソッド

def Rakuten_BooksAuthorSearch(author,hits,sort):

下でいろいろ考察しているが、結局は、

search_rakutenbooks_by_author

にしようかと思う。

語順

まず、語順が良くないかな。

SearchRakutenBooksByAuthor

とかのほうが良かった。
また、キャメルケースとかスネークケースとかってあるよね。

単語の区切り

RakutenBooksは、まぁRakutenbooksでいいのかな。。。ひとつの単語と捉える。

パスカルケース/アッパーキャメルケース
SearchRakutenbooksByAuthor
キャメルケース/ローワーキャメルケース
searchRakutenbooksByAuthor
スネークケース
search_rakutenbooks_by_author

ライブラリ

import urllib
import urllib2

ここはいかにも不細工ですね。urllibとurllib2って、API仕様がいまいちで、機能も中途半端なんです。二つもインポートしているんですが、未だとrequestsを使ったほうが断然良いです。
Requests: 人間のためのHTTP — requests-docs-ja 1.0.4 documentation

クエリの組立方

uri = 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20130522?'+\
    'applicationId='   +developerId+\
    '&affiliateId='    +affiliateId+\
    '&author='          +author+\
    '&hits='            +hits+\
    '&sort='            +sort

ここは、迷うことなく辞書を使うべきです。。。PerlとかRubyとかだと、ハッシュ(連想配列)っていうのを使うんでしょうけど、Pythonにも似たような機能があるんです。辞書って呼びます。まぁ、呼び方はどうでもいいですけど。。。

参考書籍

入門 Python 3

メイン処理の書き方

Rakuten_BooksAuthorSearch(urllib.quote("芥川龍之介"),"5","sales")

いきなりメインの処理を書いちゃってますけど、外部ファイルとしてインポートした場合にだけ処理を走らせるようにしたほうが良さそう。ワンファイルで書きたいのなら別だけど。。。

通例以下のように書いたif文の中にメイン処理を書くようです。

if __name__ == "__main__":

print処理

items = res["Items"]
    for item in items:
        print item["Item"]["title"]       
    print """<!-- Rakuten Web Services Attribution Snippet FROM HERE -->
<a href="http://webservice.rakuten.co.jp/" target="_blank">Supported by 楽天ウェブサービス</a>
<!-- Rakuten Web Services Attribution Snippet TO HERE -->"""

ここは、メソッド内に書かずに、外出しします。

戻値

戻値が無いけれども、取得したデータをjoson形式で返却しちゃいましょうか?

サンプルコード(リファクタリング後)

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import requests
import json

def search_rakutenbooks(base_uri,query):
    res = requests.get(base_uri,params=query)
    return res.json()

if __name__ == "__main__":
    base_uri = 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20130522'
    query = {}
    #共通パラメーター
    query['applicationId'] = 'DEV_ID' #自分のデベロッパーIDを設定して下さい
    query['affiliateId']   = 'AFF_ID' #自分のデベロッパーIDを設定して下さい
    #query['format'] = ''
    #query['callback'] = ''
    #query['elements'] = ''
    #query['formatVersion'] = ''
    #固有パラメーター
    #query['title'] = ''
    query['author'] = u'芥川龍之介'
    #query['publisherName'] = ’’
    #query['isbn'] = ’’
    query['hits'] = 1
    #query['page'] = ’’
    #query['availability'] = ’’
    #query['outOfStockFlag'] = ’’
    #query['chirayomiFlag'] = ’’
    query['sort'] = 'sales'
    #query['limitedFlag'] = ''
    #query['carrier'] = ''
    #query['genreInformationFlag'] = ''

    res = search_rakutenbooks(base_uri,query)
    print json.dumps(res, sort_keys = True, indent = 4)
    for item in res["Items"]:
        for key,val in item["Item"].iteritems():
            print "|",key,"|",val,"|"
    print u"""<!-- Rakuten Web Services Attribution Snippet FROM HERE -->
<a href="http://webservice.rakuten.co.jp/" target="_blank">Supported by 楽天ウェブサービス</a>
<!-- Rakuten Web Services Attribution Snippet TO HERE -->"""

コメント

search_rakutenbooks_by_author内の処理がスカスカになっちゃったwwwwwwwwwwwwwwwwwwwwwwww
ただ単純に、getして、json形式に変換して返却しているだけwwwwwwwwwwwwwwwwwwwwwwwww
まぁ、requestsがそれだけ優秀だという証しでもある。

実行結果

JSON形式そのまんま

{
    "GenreInformation": [], 
    "Items": [
        {
            "Item": {
                "affiliateUrl": "http://hb.afl.rakuten.co.jp/hgc/g00q0723.hqkjfc3b.g00q0723.hqkjg1ee/?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F11256033%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D11256033%26surl%3Dbook", 
                "author": "\u82a5\u5ddd\u9f8d\u4e4b\u4ecb/\u6709\u5ddd\u6d69", 
                "authorKana": "\u30a2\u30af\u30bf\u30ac\u30ef,\u30ea\u30e5\u30a6\u30ce\u30b9\u30b1/\u30a2\u30ea\u30ab\u30ef,\u30d2\u30ed", 
                "availability": "1", 
                "booksGenreId": "001008022007/001008022008", 
                "chirayomiUrl": "", 
                "contents": "", 
                "discountPrice": 0, 
                "discountRate": 0, 
                "isbn": "9784043944682", 
                "itemCaption": "\u5b66\u6821\u306b\u306f\u4e0d\u601d\u8b70\u306a\u8a71\u304c\u3064\u307e\u3063\u3066\u3044\u307e\u3059\u3002\u6559\u5ba4\u306e\u7a93\u304b\u3089\u6c7a\u307e\u3063\u305f\u6642\u9593\u306b\u3060\u3051\u898b\u3048\u308b\u5973\u5b50\u9ad8\u6821\u751f\u3001\u5927\u4eba\u305f\u3061\u306e\u6d88\u3048\u305f\u4e16\u754c\u3092\u751f\u304d\u308b\u5c0f\u5b66\u751f\u305f\u3061\u3001\u98a8\u8239\u5c11\u5e74\u3068\u306e\u4ea4\u6d41\u30fc\u3002\u3044\u3064\u3082\u306e\u65e5\u5e38\u304c\u3050\u306b\u3083\u308a\u3068\u66f2\u304c\u3063\u3066\u898b\u3048\u308b\u3001\u305d\u3093\u306a\u4e0d\u601d\u8b70\u306a\u8aad\u66f8\u4f53\u9a13\u304c\u5f85\u3063\u3066\u3044\u307e\u3059\u3002\u53e4\u4eca\u6771\u897f\u4eba\u6c17\u4f5c\u5bb6\u305f\u3061\u306e\u66f8\u7c4d\u521d\u53ce\u9332\u4f5c\u3084\u4e0d\u673d\u306e\u540d\u4f5c\u3092\u96c6\u3081\u305f\u3001\u77ed\u7de8\u5c0f\u8aac\u30a2\u30f3\u30bd\u30ed\u30b8\u30fc\u7b2c\uff14\u5f3e\u3002", 
                "itemPrice": 555, 
                "itemUrl": "http://books.rakuten.co.jp/rb/11256033/", 
                "largeImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4682/9784043944682.jpg?_ex=200x200", 
                "limitedFlag": 0, 
                "listPrice": 0, 
                "mediumImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4682/9784043944682.jpg?_ex=120x120", 
                "postageFlag": 0, 
                "publisherName": "\u89d2\u5ddd\u66f8\u5e97", 
                "reviewAverage": "4.33", 
                "reviewCount": 3, 
                "salesDate": "2011\u5e7408\u6708", 
                "seriesName": "\u89d2\u5ddd\u6587\u5eab", 
                "seriesNameKana": "\u30ab\u30c9\u30ab\u30ef \u30d6\u30f3\u30b3", 
                "size": "\u6587\u5eab", 
                "smallImageUrl": "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4682/9784043944682.jpg?_ex=64x64", 
                "subTitle": "", 
                "subTitleKana": "", 
                "title": "\u4e0d\u601d\u8b70\u306e\u6249\uff08\u5348\u5f8c\u306e\u6559\u5ba4\uff09", 
                "titleKana": "\u30d5\u30b7\u30ae \u30ce \u30c8\u30d3\u30e9"
            }
        }
    ], 
    "carrier": 0, 
    "count": 143, 
    "first": 1, 
    "hits": 1, 
    "last": 1, 
    "page": 1, 
    "pageCount": 100
}

出力したデータを加工してテーブルにしてみた

discountPrice 0
publisherName 角川書店
chirayomiUrl
reviewCount 3
mediumImageUrl http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4682/9784043944682.jpg?_ex=120x120
isbn 9784043944682
affiliateUrl http://hb.afl.rakuten.co.jp/hgc/g00q0723.hqkjfc3b.g00q0723.hqkjg1ee/?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F11256033%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D11256033%26surl%3Dbook
availability 1
contents
size 文庫
seriesNameKana カドカワ ブンコ
subTitle
title 不思議の扉(午後の教室)
seriesName 角川文庫
discountRate 0
titleKana フシギ ノ トビラ
largeImageUrl http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4682/9784043944682.jpg?_ex=200x200
authorKana アクタガワ,リュウノスケ/アリカワ,ヒロ
booksGenreId 001008022007/001008022008
smallImageUrl http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/4682/9784043944682.jpg?_ex=64x64
itemPrice 555
postageFlag 0
itemCaption 学校には不思議な話がつまっています。教室の窓から決まった時間にだけ見える女子高校生、大人たちの消えた世界を生きる小学生たち、風船少年との交流ー。いつもの日常がぐにゃりと曲がって見える、そんな不思議な読書体験が待っています。古今東西人気作家たちの書籍初収録作や不朽の名作を集めた、短編小説アンソロジー第4弾。
limitedFlag 0
author 芥川龍之介/有川浩
salesDate 2011年08月
itemUrl http://books.rakuten.co.jp/rb/11256033/
subTitleKana
reviewAverage 4.33
listPrice 0

Supported by 楽天ウェブサービス

お薦め書籍

入門 Python 3

入門 Python 3

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

初めてのPython 第3版

初めてのPython 第3版

みんなのPython 第3版

みんなのPython 第3版

Python文法:文字列 #Python

基礎

文字列の表記方法

ダブルクウォーテーション

標準的な書き方です。

>>> "Hello"
'Hello'

だいたいの場合、シングルクウォーテーションと大差ありません。しかし、文字列中にシングルクウォーテーションがある場合は、ダブルクウォーテーションで括ると良かったりします。

>>> "I'm Tom."
"I'm Tom."

シングルクウォーテーション

標準的な書き方です。

>>> 'Hello'
'Hello'

だいたいの場合、ダブルクウォーテーションと大差ありません。しかし、文字列中にダブルクウォーテーションがある場合は、シングルクウォーテーションで括ると良かったりします。

>>> 'He said "Hello!"'
'He said "Hello!"'

トリプルクウォーテーション

トリプルクウォーテーションというものもあります。他言語だと、ヒアドキュメントなんて呼ばれたりします。改行も含めて表現したい場合に便利です。

>>> '''Hello,
World!'''
'Hello,\nWorld!'

Unicode文字列

クウォーテーションの前にuを付けると、Unicodeで文字列を扱えます。

>>> u"日本語"
u'\u65e5\u672c\u8a9e'
>>> print u"日本語"
日本語

エスケープシーケンス

文字の中には1文字では表せない文字も存在します。例えば改行です。このような特殊な文字を記述するために使われるのがエスケープシーケンスです。

エスケープシーケンス 意味
¥¥ 「¥」文字そのもの
¥' シングルクオーテーション
¥" ダブルクオーテーション
¥a ベル
¥b バックスペース
¥f 改ページ
¥r キャリッジリターン
¥n 改行
¥t 水平タブ
¥v 垂直タブ
¥N{name} Unicode データベース中で名前 name を持つ文字
¥uxxxx 16ビットの16進数値xxxxを持つUnicode文字
¥Uxxxxxxxx 32ビットの16進数値xxxxxxxxを持つUnicode文字
¥ooo 8進数oooを持つASCII文字
¥xhh 16進数hhを持つASCII文字
¥0 NU
¥+(改行) 文字列を途中で改行する

>>> 'I\'m Tom.'
"I'm Tom."

文字列の演算

文字列の連結

>>> "ABC" + "XYZ"
'ABCXYZ'

文字列の繰り返し

>>> "Hello" * 3
'HelloHelloHello'

文字列のレングスを取得

文字列の場合

バイト数が取得出来ます。

>>> len("abc")
3
>>> len("日本語")
6

Unicode文字列

文字数が取得出来ます。

>>> len(u"abc")
3
>>> len(u"日本語")
3

参考書籍

入門 Python 3

入門 Python 3