のむログ

技術メモ / 車 / 音楽 / 雑記 / etc...

こちらは旧ブログになります。

新ブログはこちらに移行しました🙇

PythonでのWebスクレイピングするときの覚書

f:id:nomunomu0504:20190411145339p:plain:w0

== 唐突なエラー ==

今まではうまく動いていたのに急に動かなくなる。例外的なサイトが見つかるのが一番厄介だ。今日それにぶつかったので回避策

== 環境 ==

  • Python
  • BeautifulSoup

== BeautifulSoupではparserを指定するべし ==

今回のエラーの大元はここでした。あるサイトのあるタグの中身を取得したかったのですが、それができないサイトに引っかかってしまったのです。

実際に取得したかったhtmlがこちら

<div class="vnnews-text-post">
  <table border="0" cellpadding="1" cellspacing="1" style="width: 450px;">
    ...
  </table>
  <div>
    <p> ... </p>
    <p> ... </p>
    <p> ... </p>
    <p> ... </p>
    <p> ... </p>
  </div>
</div>

こんな感じで書かれているので、この div.vnnews-text-post の div を取得したかったのですが、この中に未完成なソース(かっこの数が足りないとか)が含まれた状態で、分解していくと、

div.vnnews-text-post の中に table しか無い状態で取得されます。

実はこれ BeautifulSoup に parser を指定していなかったからです。

今回は parser に html5lib を指定してあげます。 html5lib を使うために下記でインストールします。

pip install html5lib
from bs4 import BeautifulSoup
import html5lib

parser = 'html5lib' # html5lib is required. insted of html.parser
# soup = BeautifulSoup(page_html)
soup = BeautifulSoup(page_html, parser)

こんな感じで html5lib を指定してあげることによってうまく取得することができました。