はじめに
Webスクレイピングでたまによくあることのメモ。(適宜追加予定)
節子、それスペースやない、C2A0や!
BSで取ってきた文字列(line1)からパターンマッチやparseで項目を取り出そうと思ったらなぜかNone。
同じ文字列を自前で作って(line2)取り出すとこれはちゃんと取り出せる。なんやこれ・・・
print(line1 == line2)
False
しかたないので1文字ずつ比較。
for (c1, c2) in zip(line1, line2):
print(c1.encode(), end=', ')
print(c2.encode(), end=' '+str(c1==c2)+'\n')
:
b'\xc2\xa0', b' ' False
:
!?
これがかの有名なC2A0問題です(初めて知った)。いまだにあるんですねぇ、こういう問題。
C2A0問題とは:
HTMLで (ノンブレークスペース)を使うと一見ただのスペースなんだけど実は違う文字コードが割り当てられてしまう問題。見ただけでは区別がつかない。(困)
Pythonでの処理例が見つからなかったのでメモ。
line = line.encode().replace(b'\xc2\xa0', b'\x20').decode('utf-8')
こんな感じでC2A0を普通の半角スペースに変換してやりたいことはできるようになった。
(いったんencodeしなくてもできるんかな?)
Selenium、ゾンビ作りがち
なぜかいつも使ってるSeleniumのスクリプトが意味のよくわからないエラーで終了するようになった。エラーメッセージでググっていろいろ対処したり調べたりしてもどうもうまくいかない。
ふと思ってプロセス見てみたら大量のゾンビがいた。
% ps aux | grep chrome
:
(大量)
:
全部killしたら何事もなかったように動くようになった。
Seleniumでいろいろと試しながら作っているようなとき、driver.close()しないまま異常終了するとゾンビが残るので注意が必要ですね。(特にHeadlessで動かしてると気づきにくい)
JavaScriptレンダリング後のソースを表示、保存したい
一般にJavaScriptで出力したソースはブラウザの「ソースを表示」機能では見れないのでもやもやするけど、以下の方法で表示、保存が可能。
- FireFoxの場合
描画後の画面で表示保存したい部分をマウス等で選択し、右クリック「選択した部分のソースを表示」。
- Chromeの場合
デベロッパーツールを開き、「Elements」タブに表示されるソースの保存したいタグを右クリック「Copy」- 「Copy element」してどっかに貼り付け。(全体を保存したければ先頭の<html>で実行すればおk)