企業のプレスリリースをテキストマイニングしようと思うと色々大変なわけだ。そもそもプレスリリースの媒体がpdfを想定されているために、タイトルのみ本文無しという潔いRSSが多いしそういうのは購読しても嬉しくない。
というわけでプレスリリース一覧のページからpdfのURLを抜き出してpdfminerかましてデータ抽出やらないといけないしそっちのほうが逆に構造化されていてスクレイプしやすかったりする。
で、PyQueryを使ってガリガリやっていたのだが、何故かスクレイプできないサイトがあった。BeautifulSoupではちゃんとスクレイピング出来たのでエラーの原因が気になって調べてみたのでメモっておく
普通にrequestsでHTMLを取ってきてPyQueryに渡してやると :::sh >>> from pyquery import PyQuery as pq >>> import requests >>> tgpr = "http://www.transgenic.co.jp/pressrelease/" >>> d1 = pq(requests.get(tgpr).content) >>> d1 [<{http://www.w3.org/1999/xhtml}html>] >>> d1("a") []
aタグが一件も見つからない。しかし、urlオプションに直接サイトのURLを指定するときちんとparseされている
>>> pq(url="http://www.transgenic.co.jp/pressrelease/") [<html>] >>> d2 = pq(url="http://www.transgenic.co.jp/pressrelease/") >>> len(d2("a")) 71
なんだこれは?となったのでドキュメントを漁ったらxmlパーサーでパースしてみてだめだったらhtmlパーサー使うぜって書いてあったので強引にxmlパーサーでparseさせてみた。
>>> d3 = pq(url="http://www.transgenic.co.jp/pressrelease/", parser="xml") >>> d3 [<{http://www.w3.org/1999/xhtml}html>] >>> len(d3("a")) 0
というわけで文字列を渡すときにはなぜかhtmlのパーサーでparseされていないっぽい。これはコードを追うべきですな。
67行目のetree.XMLSyntaxErrorという例外が投げられてないのではないかということになった。
まぁ別にわざわざrequests使う必要もないのでurlオプションにURL渡せばいいんだけどね。