Posts Tagged DOM

ページ構造の微修正が厄介

ページの構造が微妙に変わったりすると、それだけでうまく取得できなくなるから困る。見た目はほとんど変わっていないのに。
ニコ動のランキングも、最近ちょくちょく微修正されているようで、そのたびに取得がうまくいかないようになる。

取得されないだけならまだ良いのだが、誤ったデータで更新されてしまうと面倒だ。それも、段階的に、以下のリストの下に行くほど発見・防止しにくくなる。

  1. HTMLの構造が変わったため、指定したDOMオブジェクト自体がなくなった
  2. オブジェクト内のテキストデータが別のものになった。フォーマットも異なる(例:”224,343″⇒”投稿者コメント”)
  3. テキストデータが別のものになったが、フォーマットは同じ(例:”2008年08月12日 05時”⇒”2008年08月11日 05時”)
    これは実際に、「ランキング集計期間」のstrongタグがずれたことで起こった

1.や2.は正規表現関数などでフォーマットをチェックすることで対処できるが、3.はそれだけでは不十分で、前後の文字列も含めてそのデータの意味を推測しなければ対処できない。

, ,

No Comments

HTMLをDOMDocumentに読み込み

HTMLをDOMで扱う際、HTMLスクレイピングクラスを用いてXMLに変換して使っていたが、DOMDocumentクラスのloadHTML()メソッドを用いたら普通にDOMで扱えた。処理も圧倒的に速い。考えてみれば、以前からJavaScript等でHTMLのDOMを普通に扱えていたので、PHPでも扱えて当たり前(?)である。今まで何をやってたんだろう。

先のニコニコ動画のRSSの問題も、loadHTMLを使うことで解決した。エンティティでない’&’がある場合、Warningを吐くものの、ブラウザと同じように解釈してくれるため、問題なく扱える。文字コードはHTML文書内のmetaタグの内容などから判別しているらしいので、文字コード指定のためにはmetaタグを追加してやる必要がある。

HTMLスクレイピングクラスが一体どういう使用方法のために作られたものなのか謎になってしまったので、少し調べてみようと思う。

,

No Comments

DOMとか PEAR

RSSの処理をしたかったのでまず手軽にJavaScriptで試そうとしたら、他ドメインへのHTTPリクエストは禁止のようで断念。まあ当然か。PHPでやる方針に変更。

PEARのHTTP_Requestパッケージを使えばファイルの取得が簡単そうだからさっそくやってみようとしたが、サーバにPEARが入ってなかったようで。
調べた挙句、yumでphp-pearパッケージをインストールすればいいっぽいことが判明。早速入れてみた。

それから、動作テストに何度も失敗しつつ、なんか色々手探りで、pearのHTTP_Requestパッケージをインストール。

# pear install HTTP_Request

他にDOM関数を使うためにphp-xmlモジュールが必要とのこと。本来標準で入ってるらしいが、CentOS標準のパッケージの場合は入っていないらしい。なのでインストール。

# yum install php-xml

この後Apacheをリロードしたらようやく使えるようになった。

, , , , ,

No Comments