PythonでHTMLから特定のタグを抜き出してCSVにする
PythonでHTMLからaタグをリストアップして、リンク先とリンクテキストをCSV形式で出力します。
目次
HTMLから特定のタグを抜き出す手順
例えばpreタグの中以外の箇所にある指定のタグだけを抜き出したいという場合、正規表現で検索するのはたいへんです。
そこで、HTMLをパースできるパーサーで希望のタグだけを抜き出して、その抜き出したタグに対して正規表現でさらに中身を取り出します。
ここでは、HTMLファイル内の全てのaタグを抜き出して、そのリンク先URLとリンクテキストをCSV形式で出力するようにします。
HTMLのパースにはxmlモジュールではなくBeautifulSoupを使う
HTMLはXMLの一種なので、本来はXMLとしてパースできるはずです。ただし、実際にxmlモジュールを使ってパースしようとするとエラーになります。
HTMLはXMLほど厳格ではないからです。
そこで、HTMLをパースするときはBeautifulSoupモジュールを使用します。
csv出力は文字コードと改行に注意
CSVファイルに出力した後でそのファイルをExcelで開く場合は、CSV出力の際の文字コードをshift_jisにするように注意してください。Excelでutf-8のファイルを開くと文字化けします。
また、csvモジュールのwriterowsメソッドで出力する場合は、ファイルを開くときのnewlinesを空文字に設定します。そうしないと、csvファイルの各行の間に無駄な空行が入ってしまいます。
実施例
サンプルコードはこんな感じです。
from bs4 import BeautifulSoup
import re
import csv
link_list = []
with open('a.html', mode='rt', encoding='utf-8') as f:
soup = BeautifulSoup(f.read(), 'html.parser')
link_list = soup.find_all('a')
out_data = []
for i in link_list:
m = re.match('<a.*?href="(.+?)".*?>(.*?)</a>', str(i))
if m != None:
out_data.append([m.group(1), m.group(2)])
with open('out.csv', mode='wt', encoding='shift_jis', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerows(out_data)
入力ファイルはa.htmlで、実行するとout.csvが出力されます。
公開日
広告
PythonとXMLカテゴリの投稿
- PythonでHTMLから特定のタグを抜き出してCSVにする
- PythonでHTMLを加工する
- PythonでXMLと文字列の変換
- PythonでXMLの構造を表示してみた
- PythonでXMLの読み込みと書き出し
- PythonのBeautifulSoup4でHTMLに要素を追加する
- PythonのBeautifulSoup4でHTMLの要素の内容にアクセスする
- PythonのBeautifulSoup4でHTMLの要素の内容を削除する
- PythonのBeautifulSoup4でHTMLの要素の囲いを外す
- PythonのBeautifulSoup4でHTMLの要素を削除する
- PythonのBeautifulSoup4でHTMLの要素を抜き出す
- PythonのBeautifulSoup4でHTMLの要素を新しい要素で囲う
- PythonのBeautifulSoup4でHTMLの要素を検索する
- Pythonのxmlで要素を列挙する
- PythonのxmlモジュールのElementTreeのルート要素を取得する
- PythonのxmlモジュールのElementからElementTreeを作る