HRR Co., Ltd.

技術的な記録を残していくことを目的としています。1次情報を大事にしています。

Python3でWebサイトのスクレイピングをCygwinから (2)

はじめに

hrroct.hatenablog.com

先日(よくみたら去年でした)の続き兼小ネタです。
さすがに前回書いた記事だけでは、実践したときに困ったことがあったので。

実例: tableタグのデータを拾ってみよう

例として、下記のtableのtrタグの内容を取得します。

<table>
    <thead>...</thead>
    <tbody>
        <tr><th>aaa</th><td class="name">bbb</td><td class="image"><img src="..." alt="ccc"></td></tr>
        <tr><th>ddd</th><td class="name">eee</td><td class="image"></td></tr>
        ...
    </tbody>
</table>
# coding: UTF-8

# Webサイトへのアクセスに使うライブラリをimport
import urllib.request
from bs4 import BeautifulSoup

url = "対象のURL"

try:
    # URLにアクセス
    html = urllib.request.urlopen(url)
except:
    print('Cannot open the url.')

try:
    # HTMLのパース
    soup = BeautifulSoup(html, "html.parser")
except:
    print('Cannnot read the html data.')

# HTMLを解析、欲しいデータを持ってくる
targets = soup.select('#target table tbody tr')

ここまではいいと思いますが、ここから先です。

# タグの中の文字列を取得する
for target in targets:
    header= target.select_one('th').get_text()
    name = target.select_one('td.name').get_text()
    image = target.select_one('td.image img')
    if image is None:
        image = ''
    else:
        image = image['alt']
    print(header + ',' + name + ',' + image)

ポイントは3つでしょうか。

  1. selectはlistオブジェクトで取得ができるので、select_oneで一つに絞りました。
  2. また、タグがない場合にはNoneが返るので、if文でチェックを入れました。
  3. 属性値の取得は、image['alt']でできました。
    (厳密にはalt属性の有無も見るべきなんでしょうが…)

さいごに

普段Pythonを使わないので、拙いながらも動かすことを優先しました。
わからなくなったら、やはりマニュアルを見るに限ります。
www.crummy.com

以上でした。

Tera Termで作業ログを残す(マクロ編)

はじめに

hrroct.hatenablog.com

以前は、Tera Termの設定画面からやりました。
しかし、この方法ではログに残さなくてもよい場合も残してしまいます。
(開発環境での作業などログに残さなくてもいいし…)

そこで、Tera Termマクロでログを残すことで、ログインマクロに仕込んで使えるようにしました。

やり方

ttssh2.osdn.jp

ここに書いてあるといえばそれまでなのですが…
使い方を紹介します。

私の場合

日時(年月日と時分秒)とホスト名をログファイル名につけるようにしています。

teraterm_20190610_210536_hostName.log

こうなります。

;; ホスト名取得 (testlinkで一応接続確認)
testlink
if result > 1 then
    gethostname hostname
endif

;; 日時を取得
gettime timestr "%Y%m%d_%H%M%S"

;; ログファイル名に日時とホスト名を入れる。
sprintf2 filename 'C:\log\teraterm_%s_%s.log' timestr hostname

;; ログ開始
logopen filename 0 0

ユーザー名をつけたい方もいると思います。
そういう場合は、下記のように取得できます。

; ユーザ名を取得
getenv 'USERNAME' username

ちなみに、ターミナルを落とせばログ取得は終わるので、明示的にログを終了させていません。
必要な方は、logcloseコマンドを入れておきましょう。

ttssh2.osdn.jp

おわりに

「ログ採取をしながら、定型処理を連続実行させる。」というワザもあるみたいです。
必要な方は、ぜひマニュアルを見てみてください。

ttssh2.osdn.jp

以上でした!

GASのセル内改行コードを「\n」という文字に置換する

はじめに

ニッチなお話ですが…
意外と苦戦したので、メモがてら記事にします。

「\n」に置換する理由は、その後MySQLで使う予定があるからです。

結論

str = str.replace(/\n/g, "\\n");

セル内改行は、「\n」で検索できました。
変換後は、「\」をエスケープしてやる必要があるみたいです。

以上でした!

TeraTermからCygwin (64bit版) へ接続できなかったときの対処法

はじめに

小ネタです。
TeraTermCygwinへの接続があらかじめ考えられており、深く考えずに接続可能だと思っていたのですが…
うまく行かずアレ?となったので、共有です。

結論

TeraTermCygwin の順番でインストールしていたことが原因でした。
TeraTermCygwinTeraTerm ともう一度インストールすることで、接続可能になりました。

詳細

ttssh2.osdn.jp

ここに書いてある通りなのですが、

64bit Cygwin に接続するには 64 bit Cygwin環境 でビルドされた cygterm+ プログラムが必要です。通常はTera Termのインストーラが、インストールされているCygwinのバージョンを判定して適切な実行ファイルをコピーします。

ということで、これに従いインストーラをもう一回叩いたらうまくいったというお話です。

Cygterm+をビルドする

というビルド方法についても記載がありますが、こちらを始める前に試してみるといいと思います。

おわりに

WSLの機能もよくなっておりますが…
結局はCygwinが便利で離れられません。 まだまだお世話になると思います。

以上でした。

TeraTermのマクロで端末の文字コードを変更する

はじめに

今や大体のサーバーはUTF-8だと思うのですが、たまーにEUCだったりします。
そうなったときに、TeraTermなどターミナルエミュレータ文字コードを変更しないと、日本語が文字化けして困るときがあります。
たまになので面倒くさい…それをログインマクロで対応しようというお話です。

ちなみに、追加でプラグインをインストールしないといけません。
exeファイルを準備しましょう。

ja.osdn.net

マクロを使わずに文字コードを変更する場合

面倒でなければ、画面から設定しましょう。
「端末の設定」から、文字コードの変更が可能です。

f:id:hrroct:20190405210429p:plain

「送信」に赤マルをつけ忘れましたが…
受信と送信の両方を、例えば「EUC」に変更しましょう。
もし、「UTF-8」以外に変更ができない!という方は…

f:id:hrroct:20190405210441p:plain

「全般設定」の赤マルの部分が「UTF-8」になっている可能性があります。
「Japanese」に変更して再度挑戦してみましょう。

マクロを使って変更する場合

プラグインをインストールする

f:id:hrroct:20190405210346p:plain

上の画像の、選択されたプラグイン、「TTXKanjiMenu」を選んでインストールします。

マクロを書く

ポイントは下記マニュアルにもある、callmenuです。
ウィンドウのメニューを実行できます。

ttssh2.osdn.jp

マクロですが、具体的には下記のようになりました。

;; 設定
USER_NAME = 'UserName'
HOST_NAME = 'HostName'
PASS_FILE = 'C:\path\to\password.dat'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; パスワード取得
getpassword PASS_FILE USER_NAME password

;; sshコマンド作成
command = HOST_NAME
strconcat command ':22 /ssh /auth=password /user='
strconcat command USER_NAME
strconcat command ' /passwd='
strconcat command password

;; 接続
connect command

; EUC
callmenu 54011  ; [KanjiCode] Recv: EUC-JP 
callmenu 54111  ; [KanjiCode] Send: EUC-JP

;; マクロ終了
end

終わりに

TeraTermのマクロは便利ですね…これがあるので、私はTeraTermを使い続けております。
プラグインを使えば、メニューの項目をいじることができることもわかりました。

もっと別の、便利な使い方もできるとは思いますが、今回はここまで。
以上でした。