質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2370閲覧

urllib.request.urlopenでAttributeError

kobaryo04ysh

総合スコア29

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/25 16:39

beautifulsoupを使って簡単なスクレイピングをしていて、macで構築した環境ではうまく行っていたのですが、dockerに環境構築後、うまくいかなくなってしまったので質問させていただきます。

エラー内容

test.pyというファイルに以下のようなコードを記述しており、dockerではないmacの環境ではスクレイピングに成功しました。

test.py

1from bs4 import BeautifulSoup 2import urllib.request 3from dotenv import load_dotenv 4import os 5import socket 6 7load_dotenv() 8 9suumo_url = os.getenv('SUUMO_URL') 10 11try: 12 req = urllib.request.urlopen(suumo_url, timeout=10).read() 13except socket.timeout: 14 print("timeout") 15 16name = '' 17fee = '' 18address = '' 19 20soup = BeautifulSoup(req, 'html.parser') 21contents = soup.find_all('div', class_='property') 22 23for content in contents: 24 25 if content.select('a.js-cassetLinkHref'): 26 name = content.select('a.js-cassetLinkHref')[0].get_text() 27 28 if content.select('div.detailbox-property-point'): 29 fee = content.select('div.detailbox-property-point')[0].get_text() 30 31 if content.select('td.detailbox-property-col'): 32 address = content.select('td.detailbox-property-col')[4].get_text().strip() 33 34 35 print("場所" + address + " " + name + " 家賃" + fee)

しかし、コンテナ内で実行すると以下のようなエラーが発生。

console

1(コンテナ内)# python test.py 2Traceback (most recent call last): 3 File "/root/suumo/test.py", line 12, in <module> 4 req = urllib.request.urlopen(suumo_url, timeout=10).read() 5 File "/usr/local/lib/python3.9/urllib/request.py", line 214, in urlopen 6 return opener.open(url, data, timeout) 7 File "/usr/local/lib/python3.9/urllib/request.py", line 507, in open 8 req.timeout = timeout 9AttributeError: 'NoneType' object has no attribute 'timeout'

こちらの記事や英語でのurllibに関するページなどを調べましたが、どれもtimeoutに関する設定を記述すればいいというようなことしか書いておらず、それ通りにtry, exceptを使って試してみたのですが、エラー内容は変わらず。

また、パッケージのインストール漏れなどかと思いましたが、下記の通り今回のファイル内で必要なパッケージはインストールされています。

console

1#pip list 2Package Version 3-------------- ------- 4beautifulsoup4 4.9.3 5bs4 0.0.1 6pip 21.2.1 7python-dotenv 0.19.0 8setuptools 57.4.0 9soupsieve 2.2.1 10urllib3 1.26.6 11wheel 0.36.2 12

以下はDockerfiledocker-compose.ymlです。

Dockerfile

1FROM python:3 2USER root 3 4RUN apt-get update 5RUN apt-get -y install locales && \ 6 localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 7ENV LANG ja_JP.UTF-8 8ENV LANGUAGE ja_JP:ja 9ENV LC_ALL ja_JP.UTF-8 10ENV TZ JST-9 11ENV TERM xterm 12 13RUN apt-get install -y vim less 14RUN pip install --upgrade pip 15RUN pip install --upgrade setuptools

docker

1version: '3' 2services: 3 python3: 4 restart: always 5 build: . 6 container_name: 'python3' 7 working_dir: '/root/' 8 tty: true 9 volumes: 10 - ./suumo:/root/suumo

コンテナ内のpythonのバージョンは3.9.6、ローカルのpythonのバージョンは3.9.0です。

以上となります。
ご教授よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

https://github.com/python/cpython/blob/v3.9.6/Lib/urllib/request.py#L507
ここで AttributeError: 'NoneType' object has no attribute 'timeout' がでるのですから、第1引数のsuumo_urlがNoneなのだと考えるのが自然です。

suumo_url = os.getenv('SUUMO_URL')で取得できてないということなので、コンテナでpython test.pyする前に指定するはずなのを飛ばしているんじゃないでしょうか?

投稿2021/07/26 02:21

quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

環境変数SUUMO_URLが定義されておらず、suumo_url がNoneなのではないでしょうか。
dotenvのファイルの場所や、volume、working_dirの設定が正しくないような気がします。

投稿2021/07/26 01:18

bsdfan

総合スコア4567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問