CSSセレクタとBeautifulSoupの解析結果が違う???

Python、BeautifulSoupでスクレイピングのコードを書いていた時のことです。

あるページのdiv.hugahugaをスクレイピングしたく、ChromeのコンソールからCSSセレクタで実行したところ問題ないかなと思いました。

$$('div.hugahuga');
>[5]

(ちゃんと5件取れてる!OK!)

しかし、BeautifulSoupで同じようにやってみたところ、なぜか4件しか取れず困惑。

results = soup.find_all("div", class_="hugahuga")
len(results) #=>4

なぜ???
確認してみましたが、特に関数やパラメータが間違っているわけでもなく、ページ取得が失敗しているわけでもありませんでした。

色々試してみた結果、BeautifulSoupの解析器をlxmlからhtml5libに変えてみたところ、無事全件取得することができました。
今まで何も考えず脳死でlxmlを使ってきて初めて痛い目を見ました。ちゃんと確認しないとダメですね……。

小林泰三『完全・犯罪』を読んで

SF・ミステリ作家の小林泰三の短編集「完全・犯罪」を読んでの感想です。

全体の感想

短編5作品を収録した短編集。ジャンルはSF、ミステリー、ホラーと多種多様。
特に好きなのは「双生児」「隠れ鬼」

双生児は一卵性双生児の双子の話、『私たちはあらゆるものを共有していた。』の一文が最後のオチの伏線になっているのは見事。ホラー色が強いSF

隠れ鬼はホラー。ある日浮浪者に追われた体験で、子供の頃の鬼ごっこの出来事を思い出す。鬼ごっこの背景に関する考察がとても面白い。鬼ごっこに明確なルールはない、だから明文化はされず子供達の阿吽の呼吸によってルールが作られる。このルールを利用することで一人の子供をいじめることができる。というのは納得してしまった。


以下、作品ごとの感想になります。

続きを読む

HTML5+javascriptで書けるプログラム

最近electronなるフレームワークを見つけた。
HTML5とnode.jsでGUIアプリケーションを作れるらしい。

VS CodeAtomもこのフレームワークで製作されているらしいので、信頼性はありそう。
GUIといえばこれまで.Frameworkしか使ってこなかったから、Macで開発できるというのだけでも大きい。

コンテナアルゴリズムremoveやuniqueで削除する時の注意点

`remove`や`unique`は要素を削除するが、コンテナの長さは変更されない。
そのため、アルゴリズム適用後は、いらない長さを`erase`関数で削除する必要がある。

std::vector<int> v;

v.erase(
  std::remove_if(
    changeNums.begin(),
    changeNums.end(),
    [](int x){ return x >= 5; }
  ),
  v.end()
);
std::vector<int> v;

v.erase(
  std::unique(
    changeNums.begin(),
    changeNums.end()
  ),
  changeNums.end()
);

宣言とnewの違い

1.宣言

Vector v;
double len = v.length();
  • C++ではクラスを宣言すると引数なしのコンストラクタが自動で呼び出される。
  • 呼び出されたフィールドにアクセスするには.(ドット)を使う。
  • オブジェクトはスタック領域上に実体が作成される。そのため宣言されたスコープを抜けると自動的に破棄される。

2.new演算子

Vector* v = new Vector();
double len = v->length();
delete v;
  • 呼び出されたフィールドにアクセスするには->(アロー)を使う(ポインタなので)。
  • オブジェクトはヒープ領域上に実体が作成される。 そのためnewを使用して作成されたオブジェクトは、deleteを使用して削除するまで残る。

グラフプロジェクト

グラフ理論が結構面白かったので、それを元に何かソフトを作ってみようと思う。

とりあえずはPythonjsonで作ってみて、それを操作できるGUIのソフトを作りたい。
GUIはelectronが良さそうなので、これでやってみる。

オライリーでグラフデータベースの書籍が無料だったので頑張って読んでみたい(英語…)。

参考