0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

python3でのweb scrapingメモ

Last updated at Posted at 2021-01-03

#はじめに
pythonでweb scrapingをやってみたく色々調べているのですが、内容をメモとしてまとめておこうと思います。

##利用するライブラリ

BeautifulSoupとRequestsを利用する

##pythonの実行結果をatom上で確認する方法
「script」というパッケージを使用

コード実行のショートカットはCtrl+Shift+B(windowsの場合)

BeautifulSoupに関するメモ

##requestsに関するメモ
参考記事:Requests の使い方 (Python Library)

  • httpリクエストのメソッドに対応した関数がある
  • レスポンス内容をテキスト形式で取得する(.text)とバイナリー形式で取得する(.content)のパターンがある

##UnicodeEncodeErrorについて

以下のサンプルコードをwindows環境で実行しようとするとエラーが出た

from bs4 import BeautifulSoup
import requests as req

url = 'https://www.y-shinno.com/vgg16-finetuning-uecfood100/'
html = req.get(url).content
soup = BeautifulSoup(html, 'html.parser')
text = soup.find(class_='entry-content').get_text()
print(text)

返ってきたエラー

UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 1710: illegal multibyte sequence

調べてみると、python内部の文字列のエンコード方式とwindowsの標準エンコード方式のバッティングによって発生するらしい。

解決策としては以下の記事に記載のコードをimport時に記載することで解決
(解決までにかなり時間がかかった...)

import io,sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

windowsにおいてpythonで日本語を扱う際はこれを入れておく方がいいかな?(間違ってたら指摘ください笑)

##要素を取得してスクレイピングする方法
find() or select()を使えばよい

注意:class属性をディベロッパーツールで調べる時に、ソースコードをそのままコピペするだけでは上手くいかないケースがある

<div class="l-mt10 text-ellipsis__body--2lines contents-list__item-name">あいうえお</div>

このclass属性を指定してselectしようとした時に

soup.select(".l-mt10 text-ellipsis__body--2lines contents-list__item-name")

では動かなくて

soup.select(".l-mt10.text-ellipsis__body--2lines.contents-list__item-name")

でないといけない(分かりずらい...)

##selectで取得した配列から文字列だけトリミングする方法
get_text()for~in~を組み合わせる(for文ってこうやって使うのか!)

print([t.get_text() for t in text])

こういう感じで配列の各要素に対してfor文で順次get_text()していった結果を出力すればよい。

##pythonでJSONを扱う場合
取得した要素をjson配列にしたアウトプットしたい場合、jsonモジュールとoperatorモジュールのitemgetterを利用し、for文を回して順次配列化していけばよい

###jsonモジュールについて
参考記事:

関数の区別がややこしい...

  • json.load(): 処理の結果としてファイルのJSONを辞書型に変換して返却する
  • json.loads(): プログラム上に文字列として取得済みのjsonを辞書型に変換して読み込む
  • json.dump(): 辞書型の値をJSONに変換してファイルに出力する
  • json.dumps(): 辞書型の値を文字列型に変換して出力する

###operatorモジュールのitemgetterについて
軽く見ただけなので、参考資料のみ記載

###pythonにおける配列の扱い方
軽く見ただけなので、参考資料のみ記載

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?