HTTPリクエストを簡単にできるRequestsを使ってみました。
公式ページによると、pythonに標準ではいっているurllibモジュールに比べて、APIの使いやすさが半端ないそうです。
今回はRequestsを使ってWikipediaのページをダウンロードして、その中身をファイルに書き込んでみます。
環境
関連リンク
Documentation
urllibを使ってWikipediaの記事をダウンロードする。 - どん底から這い上がるまでの記録
BeautifulSoupを使ってWikipediaのテキストを抽出する - どん底から這い上がるまでの記録
pythonの出力文いろいろまとめてみる。 - どん底から這い上がるまでの記録
まずは必要なモジュールをインポート。
import requests
入っていない場合は、pip
でインストールします。
pip install requests
モジュールをインポートしたら、リクエストを生成してウェブページを取得します。今回はWikipediaの織田信長の記事をダウンロードします。
url = "https://ja.wikipedia.org/wiki/織田信長"
response = requests.get(url)
取得したいウェブページのURLをget()
に渡すだけです。
変数response
はResponseオブジェクトになっていて、レスポンスのヘッダーやウェブページの中身などの情報があります。
print(response)
print(response.status_code)
辞書形式になっています。
print(response.headers)
html = response.text
htmlにはHTML形式の文字列が入っています。
BeautifulSoupを使って、htmlに含まれる<p></p>で囲まれた文字列を抽出してみます。
コードにすると、下のようになります。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "lxml")
p_tags = soup.find_all("p")
p_tags
にはhtmlに含まれる<p></p>(を含む)で囲まれた文字列が入っています。
print(p_tags[0])
"""<p><b>織田 信長</b>(おだ のぶなが)は、<a href="/wiki/%E6%88%A6%E5%9B%BD%E6%99%82%E4%BB%A3_(%E6%97%A5%E6%9C%AC)" title="戦国時代 (日本)">戦国時代</a>から<a href="/wiki/%E5%AE%89%E5%9C%9F%E6%A1%83%E5%B1%B1%E6%99%82%E4%BB%A3" title="安土桃山時代">安土桃山時代</a>にかけての<a href="/wiki/%E6%AD%A6%E5%B0%86" title="武将">武将</a>・<a href="/wiki/%E6%88%A6%E5%9B%BD%E5%A4%A7%E5%90%8D" title="戦国大名">戦国大名</a>。<b><a href="/wiki/%E4%B8%89%E8%8B%B1%E5%82%91" title="三英傑">三英傑</a></b>の一人。
</p>"""
ここから、タグなどを取り除いて本文だけを抽出するには、.text
でできます。
print(p_tags[0].text)
最後に、print()
を使って、<p></p>で囲まれた文字列をファイルに書き込んでみます。
import codecs
corpus = []
for p_tag in soup.find_all('p'):
corpus.append(p_tag.text.strip())
print(*corpus, sep="\n", file=codecs.open("nobunaga.txt", 'w', 'utf-8'))
corpus
というリストを用意して、その中に文字列を加えていきます。
最後に、print()
を使って改行区切りで、ファイルにリストの中身を書き込んでいます。
import codecs
import requests
from bs4 import BeautifulSoup
url = "https://ja.wikipedia.org/wiki/織田信長"
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, "lxml")
p_tags = soup.find_all("p")
corpus = []
for p_tag in soup.find_all('p'):
corpus.append(p_tag.text.strip())
print(*corpus, sep="\n", file=codecs.open("nobunaga.txt", 'w', 'utf-8'))