Webスクレイピングにおいて、データの抽出は重要な作業の1つです。その中でも、XMLという形式のデータから情報を抽出することが必要な場合があります。今回は、PythonのライブラリであるBeautifulSoupとXPathを使って、XMLからデータを抽出する方法を解説します。
BeautifulSoupとXMLの基本的な解説
BeautifulSoupは、Pythonのライブラリであり、HTMLやXMLといった文書を解析するために使用されます。XMLは、HTMLと同じマークアップ言語の1つであり、データを構造化して表現することができます。
例えば、以下のようなXMLファイルがあったとします。
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<name>John</name>
<age>30</age>
<position>Manager</position>
</employee>
<employee>
<name>Jane</name>
<age>25</age>
<position>Assistant</position>
</employee>
</employees>
これは、2人の従業員の情報を含むXMLファイルです。<employees>というタグがルート要素であり、その下に<employee>というタグが2つあります。<employee>タグの下には、<name>、<age>、<position>というタグがあり、それぞれが従業員の名前、年齢、役職を表しています。
このXMLファイルから、従業員の名前を抽出するには、BeautifulSoupを使います。以下のように、BeautifulSoupオブジェクトを作成し、find_all()メソッドを使って、<name>タグのテキストを抽出します。
from bs4 import BeautifulSoup
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<name>John</name>
<age>30</age>
<position>Manager</position>
</employee>
<employee>
<name>Jane</name>
<age>25</age>
<position>Assistant</position>
</employee>
</employees>'''
soup = BeautifulSoup(xml, 'xml')
names = soup.find_all('name')
for name in names:
print(name.text)
実行結果:
John Jane
このように、BeautifulSoupを使うことで、XMLファイルからデータを抽出することができます。
XPathの基本的な解説
XPathは、XML文書内の要素を指定するための言語です。XPathを使うことで、XML文書内の特定の要素を抽出することができます。
例えば、以下のようなXMLファイルがあったとします。
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>Python for Data Analysis</title>
<author>Wes McKinney</author>
<price>3000</price>
</book>
<book>
<title>Python Machine Learning</title>
<author>Sebastian Raschka</author>
<price>4000</price>
</book>
</books>
このXMLファイルから、タイトルが「Python for Data Analysis」の書籍の価格を抽出するには、XPathを使います。以下のように、XPathのパスを指定し、xml.xpath()メソッドを使って、要素のテキストを抽出します。
from lxml import etree
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>Python for Data Analysis</title>
<author>Wes McKinney</author>
<price>3000</price>
</book>
<book>
<title>Python Machine Learning</title>
<author>Sebastian Raschka</author>
<price>4000</price>
</book>
</books>'''
root = etree.fromstring(xml)
price = root.xpath('//book[title="Python for Data Analysis"]/price/text()')
print(price[0])
実行結果:
3000
このように、XPathを使うことで、XMLファイルからデータを抽出することができます。
BeautifulSoupとXPathを組み合わせてXMLからデータを抽出する方法
BeautifulSoupとXPathを組み合わせることで、より柔軟にXMLからデータを抽出することができます。以下のように、BeautifulSoupオブジェクトを作成し、find_all()メソッドにXPathのパスを指定して、要素のテキストを抽出します。
from bs4 import BeautifulSoup
from lxml import etree
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>Python for Data Analysis</title>
<author>Wes McKinney</author>
<price>3000</price>
</book>
<book>
<title>Python Machine Learning</title>
<author>Sebastian Raschka</author>
<price>4000</price>
</book>
</books>'''
# Convert the XML string to bytes
xml_bytes = xml.encode('utf-8')
soup = BeautifulSoup(xml, 'xml')
# Parse the bytes string
root = etree.fromstring(xml_bytes)
# Extract the price for the book by Wes McKinney
prices = soup.find_all('price', text=root.xpath('//book[author="Wes McKinney"]/price/text()'))
for price in prices:
print(price.text)
実行結果:
3000
このように、BeautifulSoupとXPathを組み合わせることで、XMLからより高度なデータ抽出を行うことができます。
具体的なコード例とその解説
以下は、XML形式のデータをスクレイピングして、CSVファイルに保存する例です。
from bs4 import BeautifulSoup
from lxml import etree
import csv
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>Python for Data Analysis</title>
<author>Wes McKinney</author>
<price>3000</price>
</book>
<book>
<title>Python Machine Learning</title>
<author>Sebastian Raschka</author>
<price>4000</price>
</book>
</books>'''
# Convert the XML string to bytes
xml_bytes = xml.encode('utf-8')
# Parse the XML
soup = BeautifulSoup(xml, 'xml')
root = etree.fromstring(xml_bytes) # Use the bytes version for lxml
# Write to CSV
with open('books.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Title', 'Author', 'Price'])
for book in soup.find_all('book'):
title = book.title.text
author = book.author.text
price = book.price.text
writer.writerow([title, author, price])
このコードは、<book>タグの中にある<title>、<author>、<price>というタグから、書籍のタイトル、著者、価格の情報を抽出し、CSVファイルに保存するものです。
BeautifulSoupとXPathを使ったデータ抽出の注意点
BeautifulSoupとXPathを使ったデータ抽出において、以下の点に注意する必要があります。
- XMLの構造によっては、XPathで要素を指定する際に注意が必要です。
- BeautifulSoupとXPathを組み合わせる場合、XPathのパスで指定した要素が、実際にBeautifulSoupオブジェクトで抽出されるとは限りません。
- BeautifulSoupとXPathを使う際には、それぞれのライブラリのドキュメントを参照することが重要です。
以上の点に注意しながら、データ抽出を行うことが重要です。
まとめ
BeautifulSoupとXPathを使って、XMLからデータを抽出する方法を解説しました。XMLとXPathの基本的な解説から、BeautifulSoupとXPathを組み合わせたデータ抽出の方法、具体的なコード例、注意点、実践的な応用例までを紹介しました。Webスクレイピングにおいて、XMLから情報を抽出することが必要な場合は、この記事を参考にしてください。
![[Python]Pandas locが遅い?効率アップのための代替手法を紹介](https://machine-learning-skill-up.com/knowledge/wp-content/uploads/2023/10/1-412.jpg)




