Python で HTML を取得して解析するスクリプトの例についてまとめておきます。
具体的には、テキストファイルで URL を指定しておくと、PythonでHTMLを取得し、そのページに記載されているリンクを抽出してテキストに書き出す方法についてまとめておきます。
以下の環境で動作を確認しています。
環境: Windows パソコン、Anaconda 3、Python 3.x、BeautifulSoup をインストール済み
背景
インターネットでサイトを見ているとき、サイトに記載されているリンクをすべて抽出してテキストで保存しておきたくなることがあります。
Google 検索したところ、すぐに使える Python のスクリプトが見あたりませんでしたので、作成し、公開しておきます。
実質的に、サイト上の HTML の全文を取得していますので、カスタマイズすると、リンクの抽出に限らず、自由に応用できると思います。
使い方
① フォルダを作り、フォルダ内に get_url1.py 等の名前でテキストファイルを作成し、下記のサンプルコードを貼りつけて保存してください。
② サンプルコードの URL の部分(url0)を修正してください。
③ コマンドプロンプト(または、Anaconda Prompt)を起動し、上記の .py スクリプトを実行してください。
例: ①のフォルダに移動し、”python get_url1.py” + [enter] とする。
→ ①と同じフォルダ内に url_list1.txt というテキストファイルが生成されます。
※ BeautifulSoup の html.parserを使って、PythonでHTMLを解析します。
※ HTMLをPythonで解析し、出力は、リンク先とサイトに書かれている文字列を抽出した、テキストファイル形式となります。必要に応じて修正してください。たとえば、リンクのみが必要な場合は、サンプルコードで該当する文字列部分を削除してください。
※ 出力されるファイルは .txt としましたが、.csv に変えればそのまま CSV ファイルとなります。必要に応じて、utf-8 となっている部分を修正して文字化け等が起きないことを確認してください。
まとめ
URL を指定すると、Pythonでhtmlを解析し、指定したページに記載されているリンクを取得、保存することができるようになりました。
URL がひとつあれば、そのHTMLに記載されている URL を次々と取得・保存できることになります。したがって、どのようにでも、サイトの分析ができるようになります。
また、結果を汎用なテキストで書き出すようにしましたので、読み出すところからプログラムを作れば、複雑な処理も可能となります。
なお、単純なリンクの取得ではなく、指定したドメインのサイトマップ(xml ファイル)からリンクを取得したい等の場合は、下記の関連リンクにまとめていますので、参考にしてみてください。あらゆる自動解析が可能となります。
関連リンク
・ 指定したサイトマップからリンクを抽出する 【Python】
・ 【selenium】 ウェブ検索と結果取得の自動化 サンプルコード【Python】
・ 天気予報を取得してテキストで出力する 【Python】
サンプルコード get_url1.py
import os
import urllib.request as rq1
from bs4 import BeautifulSoup as bs1
def write1( file1, str1 ):
with open( file1, 'w', encoding='utf-8' ) as f1:
f1.write( str1 )
return 0
def get_urls1( url0 ):
print( url0 )
res1 = rq1.urlopen( url0 )
soup1 = bs1( res1, 'html.parser' )
urls1 = soup1.find_all( 'a' )
a1 = []
for url1 in urls1:
url2 = url1.get( "href" )
str1 = url1.string or ""
a1.append( url2 + "," + str1 )
a1.sort()
return a1
path1 = os.path.dirname(__file__) + "/"
url0 = "https://www.yahoo.co.jp/"
a1 = get_urls1( url0 )
for a2 in a1:
print( a2 )
str1 = "\n".join( a1 )
file1 = path1 + "url_list1.txt"
write1( file1, str1 )