Pythonを一から勉強してデータ分析できるようになる

~ Pythonとデータ分析のお勉強の記録 ~

スクレイピング:Beautifiul Soup を使って、HTMLの解析を行ってみる

[Take0] やりたいことのイメージ

 

[Take1] とりあえず、HTML取得して表示する

BeautifulSoupとはHTML解析用のライブラリらしい。

 

【書式】

BeautifulSoup(解析対象のHTML/XML, 利用するパーサー)
 
パーサ(parser)とは、コンピュータプログラムのソースコードXML文書など、何らかの言語で記述された構造的な文字データを解析し、プログラムで扱えるようなデータ構造の集合体に変換するプログラムのこと。そのような処理のことを「構文解析」「パース」(parse)という。

 

【コード】

import requests
from bs4 import BeautifulSoup
 
# webページを取得して解析する
html=requests.get(load_url)
soup=BeautifulSoup(html.content,"html.parser")
 
# HTML全体を表示する
print(soup)

 

【結果】

長いので省略

 

 

[Take2] 特定のタグを探して表示する

 

【書式】

要素=soup.find("タグ名")
ここで、「soup」はHTMLのテキストデータが入る。
オブジェクトの型は <class 'bs4.element.Tag'>

 

【コード】

import requests
from bs4 import BeautifulSoup
 
# webページを取得して解析する
html=requests.get(load_url)
soup=BeautifulSoup(html.content,"html.parser")
 
# タグを検索して表示する
print(soup.find("title"))
print(soup.find("h2"))
print(soup.find("li"))
 
# 以下、参考-----------
print("\n")
print("soupのデータ型",type(soup))
print("soup.fingのデータ型",type(soup.find("li")))

 

【結果】

<title>Pythonのお勉強~スクレイピング(1) - じろう’s diary</title>
<h2 id="第1章-小旅行の行先検討">第1章 小旅行の行先検討</h2>
<li>近場が良いか?</li>
 
 
soupのデータ型 <class 'bs4.BeautifulSoup'>
soup.fingのデータ型 <class 'bs4.element.Tag'>

 

(補足)HTMLタグ



(補足) オブジェクトの型を取得・確認: type()関数

組み込み関数type()は引数に渡したオブジェクトの型を返す。これを使ってオブジェクトの型を確認できる。

 

[Take3] 指定タグのテキスト情報(記事情報)だけを抽出する

今度は、タグを抜いたテキスト情報を取得する。

 

【書式】

soup.find("タグ名").text
データ型:<class 'str'>

 

【コード】

import requests
from bs4 import BeautifulSoup
 
# webページを取得して解析する
html=requests.get(load_url)
soup=BeautifulSoup(html.content,"html.parser")
 
# タグを検索して表示する
print("HTMLを表示する\n")
print(soup.find("title"))
print(soup.find("h2"))
print(soup.find("li"))
print(type(soup.find("title")))
 
# テキスト情報を表示する
print("\n")
print("テキスト情報を表示する\n")
print(soup.find("title").text)
print(soup.find("h2").text)
print(soup.find("li").text)
print(type(soup.find("title").text))

 

【結果】

HTMLを表示する
 
<title>Pythonのお勉強~スクレイピング(1) - じろう’s diary</title>
<h2 id="第1章-小旅行の行先検討">第1章 小旅行の行先検討</h2>
<li>近場が良いか?</li>
<class 'bs4.element.Tag'>
 
 
テキスト情報を表示する
 
Pythonのお勉強~スクレイピング(1) - じろう’s diary
第1章 小旅行の行先検討
近場が良いか?
<class 'str'>

 

 

[Take4-0] 元HTMLから特定classの情報を抽出する

 

【書式】

soup.find(class_="クラス名")

 

【コード】

import requests
from bs4 import BeautifulSoup
 
response=requests.get(url)
soup=BeautifulSoup(response.content,"html.parser")
soup2=soup.find(class_="entry-content hatenablog-entry")
 
print(soup2)

 

【結果】

<div class="entry-content hatenablog-entry"&gt
<p> </p>
<div id="chap1">
<h2 id="第1章-小旅行の行先検討">第1章 小旅行の行先検討</h2>
<ol>
<li>近場が良いか?</li>
<li>温泉が良いか?</li>
<li>電車か車か?</li>
</ol>
</div>
<div id="chap2">
<h2 id="第2章-到着したら飯にしよう">第2章 到着したら飯にしよう</h2>
<ol>
<li>早速のお食事</li>
<li>まずは、眺めて楽しもう</li>
<li>お上品に食べ進めよう</li>
<li>お酒はほどほどに!</li>
</ol>
</div>
</div>

 

 

[Take4-1] 元HTMLから特定classの情報を抽出する(1行で書く場合)

 

【書式】

 

【コード】

import requests
from bs4 import BeautifulSoup
 
response=requests.get(url)
soup=BeautifulSoup(response.content,"html.parser").find(class_="entry-content hatenablog-entry")
 
print(soup)

 

【結果】

<div class="entry-content hatenablog-entry">
<p> </p>
<div id="chap1">
<h2 id="第1章-小旅行の行先検討">第1章 小旅行の行先検討</h2>
<ol>
<li>近場が良いか?</li>
<li>温泉が良いか?</li>
<li>電車か車か?</li>
</ol>
</div>
<div id="chap2">
<h2 id="第2章-到着したら飯にしよう">第2章 到着したら飯にしよう</h2>
<ol>
<li>早速のお食事</li>
<li>まずは、眺めて楽しもう</li>
<li>お上品に食べ進めよう</li>
<li>お酒はほどほどに!</li>
</ol>
</div>
</div>

 

 

[Take5] タグの要素をすべて抽出する方法

 

【書式】

要素のリスト=soup.find_all("タグ名")
戻り値のデータ型:<class 'bs4.element.ResultSet'>

 

【コード】

import requests
from bs4 import BeautifulSoup
 
response=requests.get(url)
soup=BeautifulSoup(response.content,"html.parser").find(class_="entry-content hatenablog-entry")
 
# 全ての liタグを検索して、その文字列を表示する。
for element in soup.find_all("li"):
  print(element.text)

 

【結果】

近場が良いか?
温泉が良いか?
電車か車か?
早速のお食事
まずは、眺めて楽しもう
お上品に食べ進めよう
お酒はほどほどに!

 

 

[Take5-1] soup.find_all() のデータ型を調べる

 

【書式】

 

【コード】

import requests
from bs4 import BeautifulSoup
 
response=requests.get(url)
soup=BeautifulSoup(response.content,"html.parser").find(class_="entry-content hatenablog-entry").find_all("li")
 
print(type(soup))

 

【結果】

<class 'bs4.element.ResultSet'>

 

 

[Take6] 特定IDのHTML情報を抽出する

 

【書式】

soup.find(id="検索名")

 

【コード】

import requests
from bs4 import BeautifulSoup
 
response=requests.get(url)
soup=BeautifulSoup(response.content,"html.parser").find(class_="entry-content hatenablog-entry")
 
# IDで検索して、そのタグの中身を表示する。
chap2=soup.find(id="chap2")
print(chap2)

 

【結果】

<div id="chap2">
<h2 id="第2章-到着したら飯にしよう">第2章 到着したら飯にしよう</h2>
<ol>
<li>早速のお食事</li>
<li>まずは、眺めて楽しもう</li>
<li>お上品に食べ進めよう</li>
<li>お酒はほどほどに!</li>
</ol>
</div>