「HTML」や「XML」を「Python」で手軽に扱いたいあなた「BeautifulSoup」はいかがでしょうか

HTML XML BeautifulSoup Python

HTMLやXMLファイルを自動的に処理したり、賢く処理をしたりするときに、ラクにプログラミングできたらいいですよね。Webページなど、クローリングしてきたデータをスクレイピングするにも、ラクにサクッとプログラミングしたいものです。

今回は、HTMLやXMLファイルをより手軽に、よりスマートに扱うための「BeautifulSoup」というライブラリの使い方を簡単にご紹介します。

複雑なHTMLやXMLも、BeautifulSoupを使うことで、サクッと処理することができます。Webサイトのスクレイピングにも活躍すること間違いなしです!

 

ちなみに、XMLファイルってなに?って方はこちらをどうぞ↓

「XMLとは?」HTMLとの違いや、どう役に立つの?ってあなたは、こちらをどうぞ

 

 

本記事の概要

BeautifulSoupとは?

「BeautifulSoup」は、HTMLやXMLファイルを処理するための便利の機能を持ったライブラリです。PythonやRubyから使うことができます。

どんなことができるの?について、1つずつ説明していきますね。

 

「BeautifulSoup」は「HTMLの間違いを補正」してくれる

どんなことができるかというと、まずは以下の例をみてください↓

docとして保存したHTMLの内容は、<body>タグは閉じられていないという間違いが含まれています。

BeautifulSoupで処理をすることで、#23 </body>のように、<body>タグが閉じるように修正されているのがわかります。

from BeautifulSoup import BeautifulSoup
import re

doc = ['<html><head><title>Page title</title></head>',
       '<body><p id="firstpara" align="center">This is paragraph <b>one</b>.',
       '<p id="secondpara" align="blah">This is paragraph <b>two</b>.',
       '</html>']

soup = BeautifulSoup(''.join(doc))

print soup.prettify()
#1 <html>
#2  <head>
#3   <title>
#4    Page title
#5   </title>
#6  </head>
#7  <body>
#8   <p id="firstpara" align="center">
#9    This is paragraph
#10    <b>
#11     one
#12    </b>
#13    .
#14   </p>
#15   <p id="secondpara" align="blah">
#16    This is paragraph
#17    <b>
#18     two
#19    </b>
#20    .
#21   </p>
#22  </body>
#23 </html>

 

 

ありがたいですね〜

 

「BeautifulSoup」は「HTMLファイルを操作」できる

他にも、HTMLファイルの中身を操作することができます。

soup.contents[0].name
# u'html'

soup.contents[0].contents[0].name
# u'head'

head = soup.contents[0].contents[0]
head.parent.name
# u'html'

head.next
# <title>Page title</title>

1番上の例は、上で生成したsoupオブジェクトから、最初のタグ名を取り出しています。

次の例では、最初のタグの中に入れ子されたタグの最初のタグ名を取り出しています。

3つ目の例では、headタグから(入れ子の)1つ外側のタグをparentを使って示しています。

4つ目は、headの次のタグ(<title>)を取り出しています。

 

このように、BeautifulSoupでは、HTMLのタグの入れ子構造(「パースツリー」といいます)を移動しながら、タグ名や中身を取り出したりすることができます

 

「BeautifulSoup」は、特定のタグや属性をもつものを「検索」できる

まず、HTMLの構造がわかってる場合には、このような検索ができます

titleTag = soup.html.head.title
titleTag
# <title>Page title</title>

soupオブジェクトのhtmlタグ⇒headタグ⇒タイトルタグとして取り出しています。

中身だけ取り出したいときには、stringを使います。

titleTag.string
# u'Page title'

 

 

HTMLが複雑になったりすると、HTMLのツリー構造を把握するのも大変です。

そういうときに、特定のタグを検索したいなら「findAll」が使えます。

 

ここでは例として、<p>タグで、かつ、align=”center”属性を持つものをすべて探しています。結果はリストで返されています。

soup.findAll('p', align="center")
# [<p id="firstpara" align="center">This is paragraph <b>one</b>. </p>]

 

条件に合う最初の1つだけ欲しい場合には、「find」も使えます。ちなみに、「find」を使うと1つだけ探すので、リストで出てきていないことがわかります。

soup.find('p', align="center")
# <p id="firstpara" align="center">This is paragraph <b>one</b>. </p>

 

「BeautifulSoup」で「XMLファイル」を操作する

上でHTMLを例に説明したように、XMLでもBeautifulSoupは威力を発揮します。

HTMLのように、特定のタグを検索して、取り出したりすることも可能です。

じゃあ違いはなんなの?ってことですが、ここでは基本的な2つのポイントを挙げました。

「BeautifulSoup」で「XML」、HTMLとの2つの違いとは?

①、XMLを扱うときには、「BeautifulStoneSoup」をインポートする

# For processing HTML
from BeautifulSoup import BeautifulSoup          

# For processing XML
from BeautifulSoup import BeautifulStoneSoup     

# To get everything
import BeautifulSoup

ちなみに、HTML、XMLどちらもという方は、3番目のようにするとオッケーです^^

 

②、XMLは、間違いの自動修正がむずかしい

HTMLについては、BeautifulSoupは、タグの閉じ忘れなど、間違いがあれば自動的に修正してくれました。HTMLはルールが決まっているため、そういった修正が可能だったんでした。

ところが、XMLにはHTMLのような明確なルールがありません。

なので、HTMLのようなタグの修正などが苦手という特徴があります。

 

 

というわけで、今回は「BeautifulSoup」について、簡単な概要を説明しました。

だいたいどんなことが出来るか把握していただけたでしょうか?

もっと詳しい内容が必要でしたら、以下のドキュメントをご覧ください↓

(日本語)Beautiful Soupドキュメント

(英語)Beautiful Soup Documentation

 

実際の活用には、以下の本もおすすめです↓

 

 

 

こちら無料です↓