わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

垂直タブを含むHTMLを,REXMLに通すとエラー

数日前から,少しずつ時間をとって,Rubyスクリプトを書いています.2つに分けています.1番目のスクリプトファイルを実行すると,Selenium (selenium-webdriver)とヘッドレスChromeを使って,Webページを収集します.その後,2番目のスクリプトファイルを実行しまして,収集して保存したファイルを順に参照し,必要な要素だけを取り出します.
2番目のスクリプトで,読み出しにはREXMLライブラリを使用しています.読み出し対象は,XMLではなくHTMLですが,とくにエラーは発生しません.REXML::XPath.firstを使うと,XPath指定を使ってピンポイントで必要な箇所を取得できるのがメリットとなります.なお,XPathを手書きするとバグのもとですが,保存したHTMLファイルをFirefoxで開き,F12キーで開発ツールを出して,インスペクターでほしい要素を見つければ,右クリックして「コピー > XPath」により,ロケーションパスがコピーできます.
気を良くして,処理させていると,2番目のスクリプトで,実行時エラーが発生しました.
エラーメッセージには「Illegal character "\v" in raw string」と出ています.
「\v」は垂直タブです.HTMLファイルを,Emacsで開くと,「^K」と表示される1バイトコードとなっていました.C-dで削除し,保存しました.
他のHTMLファイルにもあれば,またそこでエラーが出ます.grepコマンドで探すとして…「grep -l '\v' *.html」*1ではうまくいきません.http://www.atmarkit.co.jp/flinux/rensai/linuxtips/a018bashhexcode.htmlによると「$'<文字列>'という指定をすると、それがバックスラッシュでエスケープされている文字に置き換えられる」とあり,zshでもうまくいきました.コマンドは,「grep -l $'\v' *.html」です.と,苦労したものの,実行結果は「なし」です.先ほどの1件だけだった,というわけです.
ともあれ今後も,垂直タブを含んだHTMLが出てくるかもしれません.1番目のスクリプトで,ファイルに保存する前に,取り除きましょう.driver.page_sourceにより,ページのソースを獲得している箇所を,「driver.page_source.gsub!(/\v/, "")」とします.2つのスクリプトを順に実行し,とりあえずエラーは出ませんでした.

*1:オプション「-l」を指定することで,該当ファイル名だけを出力します.