Python3メモ - BeautifulSoup4のあれこれ

BeautifulSoupとは

Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers hours or days of work.

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation より引用

 

 BeautifulSoupのインストールとインポート

pip3 install beautifulsoup4

from bs4 install BeautifulSoup

BeautifulSoupに用いるParserのインストー

pip3 install html.parser

pip3 install lxml

 

BeautifulSoupの簡単な例(アンカータグの抽出)

>>> from bs4 import BeautifulSoup as BS
>>> import requests
>>> page = requests.get("https://www.crummy.com/software/BeautifulSoup/bs4/doc")
>>> soup = BS(page.text, "lxml")

>>> soup.a 
<a accesskey="I" href="genindex.html" title="General Index">index</a>

>>> for anchor in soup.find_all("a"):
...     print("{}({})".format(anchor.string, anchor.get("href")))
...
index(genindex.html)
Beautiful Soup 4.4.0 documentation(#)
¶(#beautiful-soup-documentation)
Beautiful Soup(http://www.crummy.com/software/BeautifulSoup/)
Beautiful Soup 3(http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html)
...

各種の要素の取得・操作等

子要素・親要素・兄弟要素 関連

soup.body.name # bodyのタグ名を返却

 

soup.body.contents #  bodyの子要素をリスト形式で返却

soup.body.children # bodyの子要素をジェネレータ形式で返却

 

soup.body.descendants # bodyの子要素をジェネレータ形式で再帰的に返却

soup.body.strings # bodyの子要素に含まれる文字列全てをジェネレータ形式で返却

 

soup.title.parent # titleの親要素全体を取得

soup.title.parents # titleの親要素を再帰的に取得(BeautifulSoupオブジェクトに行きつくと終了)

 

soup.p.next_sibling # 最初のp要素の次の兄弟要素を取得

soup.p.previous_sibling # 最初のp要素の前の兄弟要素を取得

 

soup.p.next_element # 最初のp要素の次の兄弟要素を取得(要素内も順次取得)

soup.p.previous_sibling最初のp要素の前の兄弟要素を取得(要素内も順次取得)

 検索(find, find_all, select)

soup.find("a") # 最初のa要素を検索

soup.find_all("a") # a要素をリスト形式ですべて取得
# soup("a") ... find_allは省略可能

soup.find_all("a",limit=5) # a要素をリスト形式で5個まで取得

soup.find_all(["a","p"]) # p要素とa要素をリスト形式ですべて取得

soup.find_all(text="piyo") # 要素内に指定文字列を持つ要素を取得

 

def my_filter(t):
    return t.has_attr("id")

soup.find_all(my_filter) # 自作フィルターの利用

 

soup.find_all(id="hoge") # キーワード引数を用いた検索

soup.find_all(attrs={"id":"hoge", "class":"huga"}) # 辞書を用いた複数条件の検索

soup.p.find_all_next() # 最初のp要素以降の要素をすべて取得(再帰的)

soup.p.find_all_previous() # 最初のp要素以前の要素をすべて取得(再帰的)

 

soup.select("#hoge") # idにhogeを持つ要素をCSSセレクタ記法で取得

soup.select(".huga") # classにhugaを持つ要素をCSSセレクタ記法で取得

要素の変更・追加

soup.p.name = "h1" # 最初のp要素をh1要素に変更

soup.p.string = "piyo" # 最初のp要素内をpiyoに変更

soup.p.append("huga") # 最初のp要素内にhugaを追加

soup.p["id"] = "hoge" # 最初のp要素のidをhogeに変更

del soup.p["class"] # 最初のp要素のclass属性を削除

 

soup.body.append(soup.new_tag("p")) # body要素の最後尾にp要素を追加

soup.p.insert_after(soup.new_string("hoge")) # 最初のp要素の直後にhoge文字列を追加

 

soup.p.clear() # 最初のp要素内のコンテンツを削除

soup.p.extract() # 最初のp要素を抽出し返却(抽出されたp要素は削除される)

soup.body.decompose() # body内の要素を全削除

 

soup.p.wrap(soup.new_tag("div")) # 最初のp要素をdiv要素で包む

soup.p.unwrap() # 最初のp要素のタグを外す(返却値はタグ)