SIRIUSのサイトをWordPress化したくて、地道にSIRIUSのコンテンツをWordPressへ投稿していけばできるんだろうけど、それってかなり面倒。
WordPressにCSVで一括投稿できるプラグインもあるらしいから、SIRIUSのコンテンツをCSV化すれば、あとは一括で出来そう。
でも、それもCSV化するのが面倒。
ってことで、PythonでSIRIUSの記事をスクレイピングして、それをWordPressへ投稿するツールを作れば、Pythonの勉強にもなって一石二鳥!と思って作り始めた。
スクレイピングの肝はBeautifulSoupだよね
前に簡単なスクレイピングの練習プログラムを作ったことはあるから、それを元に作る。
それはサンプルのソースをマネただけで、大雑把な流れは理解していたけど、細かいところはあとで理解しようと思っていたので、今回少し詳しく勉強しながら作っていこうと思っていたの。
でもね、BeautifulSoupをある程度使えたら、そんなに難しくなかったのよね。BeautifulSoupの使い方っていうか、XPathの方がややこしい。
実際にはXPathだけじゃなくて、CSSセレクターで要素を取得する方法もあるみたいだけど、今回はパス。XPathだけでやることにする。
まぁ、XPathもChromeで「検証」のツールを使えば一発でわかっちゃうんだけど。それにSIRIUSの記事って、そんなにめんどくさい構造でもないから困ることはなかったけど。
でもね、BeautifulSoupって便利だけど、なんかよくわかってなかったみたい。
BeautifulSoupはオブジェクトで文字列じゃない
知ってる人からすると当たり前のことなんだと思うけど、BeautifulSoupって文字列じゃないのよね。オブジェクトなのよね。
print()で、BeautifulSoupオブジェクトを引数にすると表示できるじゃない?
だから文字列なんだと思いこんでた。
でも、あれってprintがケアしてくれて?、表示できるのよね。
print("x = " + soap)
とかやったらエラーになる。「strじゃない!」って怒られる。
しばらく意味わかんなかったわ。
文字列で欲しいなら、そこまで指定しなきゃいけないのよね。例えば、”soap.text”とか。
やっぱり、ちゃんと説明とかリファレンスとか読まないで、サンプルプログラムだけ見てわかった気になってしまうけど、ちゃんとはした理屈は理解できていないのよね。
昔のC言語みたいに、あれこれ自分でコード書かなくて済んじゃって、いろいろ便利にやってくれるから、つい「こんなもんで出来るかしら?」って思っちゃうのよね。
とは言っても、そういうのじーっくり読んでからにすると、いつになったらコードが書けるのかわからないから、作って、ハマって、調べてまたトライって感じでやっていくわ。
トータルでどっちが効率的かわかんないけど、プログラム書かないとつまらいもの。
うっかりfind()とfind_all()を間違えて悩む
あと最初のハマったのが、BeautifulSoupのfind()とfind_all()の間違え。
いや、違いは知っていたのよ。戻りが単品なのかリストなのかって。
どっかからコピペした際に、find()のつもりだったのにfind_all()って書いてあった。
というのに気づかず、どうしても動かすとエラーになる。
型宣言とかしなくていいから、いきなり初登場の変数に戻りを入れられる。
それが、こっちはsoupの単品が入っているつもりでアクセスしてしまっているから、当然エラーになるわよね。だって中身はリストなんだもの。
まーfind()のハズっていう思い込みが悪かったんだけど。
エラーのメッセージで原因が即ピンとこなかったのも、まだまだPython自体にも慣れてないから、どこに問題があるのか手探り状態なのよね。
これからやっていって経験を積みながら勘どころを磨いていくしかないわね。
SIRIUSの記事のスクレイピングは完成
こんなところでコケながらも、とりあえずSIRIUSの記事のスクレイプのプログラムは出来上がったわ。
ホント、めんどくさいところは全部Pythonとかライブラリとかがやってくれるから、出来上がったソースは超シンプル。
これをC言語で書いたらと思うとゾッとするわ。
コメント