電子竹林:Blog2

Tech関係、はてなダイアリーから移転済み...

BeautifulSoup、<br>のchildGenerator()での切り分け

概略

BeautifulSoup、<br>で区切られているトコはchildGenerator()を使って切り分けるのがベスト…なのか??

詳細

  • 自作のツールでスクレイビングしているものがある、PythonでBeautfifulSoupを使用。
  • スクレイビングしているサイトがちょっと変更すると書き直さないといけないので面倒、まあ当然であるが、そもそもDOMの理解も薄く、サイトのデザインの心得がないのでイマイチわからない。
  • で、動かなくなると、Safariで開いてその位置でコンテクストメニュー(右クリック)で「要素の詳細を表示」して、ソースを調べる(chromeの方が便利という意見多数だが、たまに使うだけなのでSafariのコレで十分便利)。
  • 今回悩んだのが次のように<br>で区切られている場合はどう切り分けるべきなのかという問題、”bar=“の場合だけ取り出したい、だがbar=が無い場合もある。
<p class="data">foo=100<br/>bar=200<br/>foobar=300</p>
  • で、ググった感じではchildGenerator()を使って切り分けるのが妥当というので、次のようにしてみた(dataに入っているとして)。
for d in data.childGenerator():
    if type(d) is NavigableString:
      s:str = d
      if “bar=” in s:
          bar = s.replace(“bar=”,””) 
  • childGenerator()で分けると、”foo=100”の部分は型が"class bs4.element.NavigableString"だけど、<br>の部分は型が"class bs4.element.Tag"となるのも条件判定が面倒臭い(そのせいで最初に from bs4.element import NavigableString している)。
  • 文字列の取り出し方もイマイチ感、もっとエレガントな方法ありそうなもんだけど、スクレイビングはいつも泥臭いな。

    Links

    www.crummy.com kondou.com