highlighter

Samstag, 25. Januar 2025

Extracting tags with BeautifulSoup4

  h2とh3の構成と内容だけ知りたい事がままあると思います.

  既にcmdやpowershell上でpythonコマンドが実行可能な状態である事だけが前提で, 下記の二行が追加で必要なコマンドです.

  • python -m pip install requests
  • python -m pip install beautifulsoup4

  以下は参考にいたしましたpython programming youtuberさんの動画です(使用モジュールは説明そのままです).
  youtube : 【PythonでWebスクレイピング】Beautiful Soupの使い方解説! 〜 初心者向け 〜 プログラミング入門
  動画を10分一寸のところ迄見れば後は自分で自在に使えるやうになる筈です.

  以下はソース, 適当なテキストファイルに記述して拡張子は.pyで保存します.

import requests
import sys
from bs4 import BeautifulSoup
import time

def main():
  soup = BeautifulSoup(requests.get(sys.argv[1]).text, 'html.parser')
  if None != soup.find('body'):
    for h2 in soup.find_all('h2', class_="hogepi_2"):
      time.sleep(1)
      if h2.string != None:
        print(f'{h2.string}')
      for h3 in soup.find_all('h3', class_="hogepi_3"):
        time.sleep(1)
        if h3.string != None:
          print(f'    {h3.string}')

if __name__ == '__main__':
  if len(sys.argv) < 2:
    sys.exit()
  main()

tag2 1

tag3 1

tag3 2

tag3 3

tag2 2

tag3 4

tag3 5

tag3 6

  で, 適当に自分の記事に掛けて結果をテキストファイルへ出力してみますと......私は普段見出しを"無視して書いている"のとblogの設定的な事もあるのか思つた通りの形ではありませんがそれとなく取得出来たやうです(正しく構成されたページだと綺麗に取得出来ました).
  
  h2の下にh3が居るので単純にh2の前でh1かbodyを見ればいけるか(?)と試したら駄目で, 個別ページのソース全体を確認したところ右側のサイドバーのウィジェットがh2で定義されていたのでその回数分ループが回り, h3も釣られて大量に回つていたのでした. classを適当に追加したら予期した形となりましためでたし......じゃないですねえ, 良い感じだけれどh3の1~3と4~6が綺麗に分かれていませんでした. h3が全て同じclassなのでどのh2配下なのか区別出来ないからしゃーない.
  

  ちょびつとhtmlの構成を覗きたい時用に.

import sys
import requests

class req():
  def __init__(self, url):
    self.r = requests.get(url)

  def r1(self):
    print(f'encoding:{self.r.encoding}, apparent_encoding:{self.r.apparent_encoding}, headers:{self.r.headers}')
    print(f'response_body:{self.r.content}')
    print(f'encoded_response_body:{self.r.text}')
  def r2(self):
    # unimplemented
    pass
  def r3(self):
    # unimplemented
    pass

def main(url):
  r = req(url)
  r.r1()

if __name__ == '__main__':
  if len(sys.argv) > 1:
    main(sys.argv[1])
  else:
    sys.exit()