Drkcore

14 06 2016 Python Tweet

PyQueryの挙動がちょっとわからん

企業のプレスリリースをテキストマイニングしようと思うと色々大変なわけだ。そもそもプレスリリースの媒体が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渡せばいいんだけどね。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021