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.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要素のタグを外す(返却値はタグ)