LoginSignup
1

Python3: URLをコマンドライン引数で(wikipedia) docker(90)。プログラムちょい替え(2)

Last updated at Posted at 2019-05-01

実験

wikipediaからのページからリンク一覧を取得する方法
https://qiita.com/tadaken3/items/e09ba2ede988bbacb303

のプログラムに手を入れて、引数渡しにしてみた。

<この項は書きかけです。順次追記します。>

wia.py
#! /usr/bin/env python
#codeing:utf-8
# https://qiita.com/tadaken3/items/e09ba2ede988bbacb303
# https://qiita.com/kaizen_nagoya/items/fc095b0c580a35001ea7

import sys
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import unquote

args = sys.argv

url = "https://ja.wikipedia.org/" + args[1]

html = urlopen(url)
bsObj = BeautifulSoup(html,'html.parser')

pattern = re.compile("^(/wiki/)((?!:).)*$")

for link in bsObj.find('div',{'id':'bodyContent'}).findAll('a',href = pattern):
        if 'href' in link.attrs:
                    print (unquote(link.attrs['href']))  

HAZOPを引数で実行ー>エラー

# ./wia.py HAZOP
Traceback (most recent call last):
  File "./wia.py", line 14, in <module>
    html = urlopen(url)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 531, in open
    response = meth(req, response)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 569, in error
    return self._call_chain(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found

統計を引数で実行ー>エラー

/# ./wia.py 統計
Traceback (most recent call last):
  File "./wia.py", line 14, in <module>
    html = urlopen(url)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 525, in open
    response = self._open(req, data)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 543, in _open
    '_open', req)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 1360, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 1317, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "/opt/conda/lib/python3.7/http/client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/opt/conda/lib/python3.7/http/client.py", line 1240, in _send_request
    self.putrequest(method, url, **skips)
  File "/opt/conda/lib/python3.7/http/client.py", line 1107, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)

文字によってエラーが違う。

wia2.py
#! /usr/bin/env python
#codeing:utf-8
# https://qiita.com/tadaken3/items/e09ba2ede988bbacb303
# https://qiita.com/kaizen_nagoya/items/fc095b0c580a35001ea7

import sys
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import unquote

args = sys.argv

url = "https://ja.wikipedia.org/" + args[1]

html = urlopen(url)
bsObj = BeautifulSoup(html,'html.parser')

pattern = re.compile("^(/wiki/)((?!:).)*$")

for link in bsObj.find('div',{'id':'bodyContent'}).findAll('a',href = pattern):
        if 'href' in link.attrs:
                    print (unquote(link.attrs['href'])) 

文字コード変換を入れてみた。

wib.py
#! /usr/bin/env python
#codeing:utf-8
# https://qiita.com/tadaken3/items/e09ba2ede988bbacb303
# https://qiita.com/kaizen_nagoya/items/fc095b0c580a35001ea7

import sys
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
import urllib.parse 

args = sys.argv

url = "https://ja.wikipedia.org/" + urllib.parse.quote(args[1])

html = urlopen(url)
bsObj = BeautifulSoup(html,'html.parser')

pattern = re.compile("^(/wiki/)((?!:).)*$")

for link in bsObj.find('div',{'id':'bodyContent'}).findAll('a',href = pattern):
        if 'href' in link.attrs:
                    print (unquote(link.attrs['href']))  

実行してみる。ー>エラー

# ./wib.py 統計
Traceback (most recent call last):
  File "./wib.py", line 12, in <module>
    url = "https://ja.wikipedia.org/" + urllib.parse.quote(args[1])
NameError: name 'urllib' is not defined

2つのimportに関する行を、一つにまとめられるかと思ったら駄目だった。

wic.py
#! /usr/bin/env python
#codeing:utf-8
# https://qiita.com/tadaken3/items/e09ba2ede988bbacb303
# https://qiita.com/kaizen_nagoya/items/fc095b0c580a35001ea7

import sys
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import unquote
import urllib.parse 

args = sys.argv

url = "https://ja.wikipedia.org/" + urllib.parse.quote(args[1])

html = urlopen(url)
bsObj = BeautifulSoup(html,'html.parser')

pattern = re.compile("^(/wiki/)((?!:).)*$")

for link in bsObj.find('div',{'id':'bodyContent'}).findAll('a',href = pattern):
        if 'href' in link.attrs:
                    print (unquote(link.attrs['href']))  

1行追加(前からあったもの)を入れて実行してみる。
まだまだエラー

# ./wic.py hazop
Traceback (most recent call last):
  File "./wic.py", line 14, in <module>
    html = urlopen(url)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 531, in open
    response = meth(req, response)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 569, in error
    return self._call_chain(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found

だめやん。URLに/wiki/がない。

wid.py
#! /usr/bin/env python
#codeing:utf-8
# https://qiita.com/tadaken3/items/e09ba2ede988bbacb303
# https://qiita.com/kaizen_nagoya/items/fc095b0c580a35001ea7


import sys
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import unquote
import urllib.parse 

args = sys.argv

url = "https://ja.wikipedia.org/wiki/" + urllib.parse.quote(args[1])

html = urlopen(url)
bsObj = BeautifulSoup(html,'html.parser')

pattern = re.compile("^(/wiki/)((?!:).)*$")

for link in bsObj.find('div',{'id':'bodyContent'}).findAll('a',href = pattern):
        if 'href' in link.attrs:
                    print (unquote(link.attrs['href']))  

統計を引数ではうまくいった。

# ./wib.py 統計
/wiki/ウィキペディア日本語版
/wiki/現象
/wiki/調査
/wiki/数量
/wiki/データ
/wiki/統計量
/wiki/統計学
/wiki/国家
/wiki/兵役
/wiki/人口
/wiki/土地
/wiki/近代国家
/wiki/ナポレオン・ボナパルト
/wiki/フランス
/wiki/オーストリア
/wiki/パーソナルコンピュータ
/wiki/大学
/wiki/企業
/wiki/統計法
/wiki/律令制
/wiki/戸籍
/wiki/検地
/wiki/人別改
/wiki/明治政府
/wiki/1871年
/wiki/太政官
/wiki/正院
/wiki/1885年
/wiki/内閣
/wiki/総務省
/wiki/総理府
/wiki/統計局
/wiki/独立行政法人
/wiki/統計センター
/wiki/統計法
/wiki/個人情報
/wiki/2007年
/wiki/1947年
/wiki/2007年
/wiki/統計法
/wiki/地方公共団体
/wiki/都道府県
/wiki/市町村
/wiki/総務大臣
/wiki/統計法
/wiki/2007年
/wiki/10月
/wiki/国勢調査
/wiki/家計調査
/wiki/個人
/wiki/消費
/wiki/賃金
/wiki/通関
/wiki/貿易統計
/wiki/国民経済計算
/wiki/鉱工業指数
/wiki/統計学
/wiki/企業
/wiki/電通
/wiki/広告
/wiki/第三次産業
/wiki/プライバシー
/wiki/個人情報保護法
/wiki/規制緩和
/wiki/行政指導
/wiki/標準化
/wiki/トレードオフ
/wiki/小泉内閣
/wiki/聖域なき構造改革
/wiki/市場化テスト
/wiki/総務省
/wiki/国勢調査
/wiki/労働力調査
/wiki/家計調査
/wiki/経済センサス
/wiki/財務省_(日本)
/wiki/国税庁
/wiki/文部科学省
/wiki/厚生労働省
/wiki/農林水産省
/wiki/農林業センサス
/wiki/経済産業省
/wiki/国土交通省
/wiki/日本経済団体連合会
/wiki/ウィクショナリー
/wiki/統計学
/wiki/統計主事
/wiki/独立行政法人

hazopを引数だと駄目。

# ./wib.py hazop
Traceback (most recent call last):
  File "./wib.py", line 15, in <module>
    html = urlopen(url)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 531, in open
    response = meth(req, response)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 563, in error
    result = self._call_chain(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 755, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 531, in open
    response = meth(req, response)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 569, in error
    return self._call_chain(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/opt/conda/lib/python3.7/urllib/request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found

大文字にすると動く。

# ./wib.py HAZOP
/wiki/FMEA
/wiki/フォルトツリー解析
/wiki/FMEA
/wiki/日本学術会議
/wiki/安全工学シンポジウム
/wiki/TRIZ
/wiki/小川清
/wiki/日本技術士会
/wiki/ISSN
/wiki/デジタルオブジェクト識別子
/wiki/Portable_Document_Format

大文字に変換してみる。

#! /usr/bin/env python
#codeing:utf-8

import sys
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import unquote
import urllib.parse 

args = sys.argv

url = "https://ja.wikipedia.org/wiki/" + urllib.parse.quote(args[1].upper())

html = urlopen(url)
bsObj = BeautifulSoup(html,'html.parser')

pattern = re.compile("^(/wiki/)((?!:).)*$")

for link in bsObj.find('div',{'id':'bodyContent'}).findAll('a',href = pattern):
        if 'href' in link.attrs:
                    print (unquote(link.attrs['href']))  

やっつけ感満載。

# ./wic.py fmea
/wiki/英語
/wiki/故障
/wiki/不具合
/wiki/設計
/wiki/フォルトツリー解析
/wiki/トップダウン手法
/wiki/ボトムアップ手法
/wiki/フォルトツリー解析
/wiki/HAZOP
/wiki/国際電気標準会議
/wiki/故障モード
/wiki/英語
/wiki/FMEA#工程FMEA
/wiki/HACCP
/wiki/フォード・モーター
/wiki/フォード・ピント#欠陥
/wiki/グラマン
/wiki/先行製品品質計画
/wiki/トヨタ自動車
/wiki/HAZOP
/wiki/製品
/wiki/ヒューマンエラー
/wiki/安全
/wiki/リスクアセスメント
/wiki/リスク分析
/wiki/信頼性工学
/wiki/信頼性設計
/wiki/工学
/wiki/技術

でも動いた。

windows/anaconda3

>wic.py hazop

なんの出力も、エラーもない。
ファイルのプロパティを開いて、anacondaフォルダを探し、
ユーザの下にAnaconda3というフォルダのpythonファイルを関連付け

wi_py.png

>python wic.py hazop
/wiki/FMEA
/wiki/フォルトツリー解析
/wiki/FMEA
/wiki/日本学術会議
/wiki/安全工学シンポジウム
/wiki/TRIZ
/wiki/小川清
/wiki/日本技術士会
/wiki/ISSN
/wiki/デジタルオブジェクト識別子
/wiki/Portable_Document_Format

>wic.py hazop
Traceback (most recent call last):
  File "C:\Users\kaize\Downloads\wic.py", line 15, in <module>
    url = "https://ja.wikipedia.org/wiki/" + urllib.parse.quote(args[1].upper())
IndexError: list index out of range

pythonで起動すれば動く、pythonつけないとエラーになるやん。

WindowsでanacondaのPythonに引数が渡せない?
https://ja.stackoverflow.com/questions/40319/windowsでanacondaのpythonに引数が渡せない

レジストリファイルは、今なおしたくない。Windowsではpythonをつけて動かすことに。

docker

$ docker run -v /tmp/docker:/tmp/docker -it kaizenjapan/python23wi /bin/bash

-v /tmp/docker:/tmep/dockerは、dockerを起動するシステムに/tmp/dockerというフォルダが利用可能な場合に記載。フォルダ名は、利用できるもので、docker側が空のものであればよい。

docker(89) dockerでpython2, python3
https://qiita.com/kaizen_nagoya/items/ecbe11a4d743357134d5

今日のpython error: ModuleNotFoundError: No module named 'bs4'
https://qiita.com/kaizen_nagoya/items/f0056e5fc735b3ad5783

今日のpython error: UnicodeEncodeError: 'utf-8' codec can't encode characters
https://qiita.com/kaizen_nagoya/items/ac48ba7946b303bb25fb

参考資料(reference)

Pythonプログラムの先頭行の #! シバン(Shebang)について
https://gammasoft.jp/python/python-shebang/

「wikipediaからのページからリンク一覧を取得する方法」を動かしてみた
https://qiita.com/kaizen_nagoya/items/ef4a8d21ec98851d10a0

Python: コマンドライン引数とは?(超基礎)
https://qiita.com/orange_u/items/3f0fb6044fd5ee2c3a37

PythonでURLのクエリ文字列(パラメータ)を取得・作成・変更
https://note.nkmk.me/python-urllib-parse-query-string/

URLに引数を渡したい
https://teratail.com/questions/109883

【初心者向け】PythonでURLを指定して画像をダウンロードする
https://qiita.com/ozaki_physics/items/c17ca626b480d352e90f

コマンドライン引数の取得
http://books-nekoya.jp/Programming/Python/python_command_line_prm.html

pythonでget引数にjavascriptでencodeURIComponent()したurlを渡したらcgi.FieldStrage()がおかしくなる
https://ja.stackoverflow.com/questions/11954/

PythonでURLエンコード・デコード
https://note.nkmk.me/python-urllib-parse-quote-unquote/

PythonのURLとクエリパラメータのパースまとめ
https://qiita.com/yagays/items/e59731b3930252b5f0c4

【保存版】Pythonの文字変換(半角,全角,小文字,大文字)
https://qiita.com/shakechi/items/d12641d6cad01479785f

<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>

文書履歴(document history)

ver. 0.01 初稿 20190501 夕
ver. 0.02 動作版 20190501 夜
ver. 0.03 windows/anaconda3追記 20190501真夜中
ver. 0.04 詳細部分追記 20190502
ver. 0.05 項目入れ替え 20190514 午後
ver. 0.06 引数追記 20190514 夜
ver. 0.07 docker追記 20191230
ver. 0.08 error追記 20191231 朝
ver. 0.09 docker run 20191231 午前

最後までおよみいただきありがとうございました。

いいね 💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚 and follow me for your happy life.

このエントリーをはてなブックマークに追加
http://b.hatena.ne.jp/guide/bbutton

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
1