PythonでHTMLから特定のタグを抜き出してCSVにする

PythonでHTMLからaタグをリストアップして、リンク先とリンクテキストをCSV形式で出力します。

目次

  1. HTMLから特定のタグを抜き出す手順
  2. HTMLのパースにはxmlモジュールではなくBeautifulSoupを使う
  3. csv出力は文字コードと改行に注意
  4. 実施例

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カテゴリの投稿