3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AUTOSAR CountdownAdvent Calendar 2022

Day 10

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

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

一覧

物理記事 上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

量子(0) 計算機, 量子力学 https://qiita.com/kaizen_nagoya/items/1cd954cb0eed92879fd4

数学関連記事100
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

言語・文学記事 100
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事一覧
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

自動車 記事 100
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

通信記事100
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

日本語(0)一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

転職(0)一覧
https://qiita.com/kaizen_nagoya/items/f77520d378d33451d6fe

仮説(0)一覧
https://qiita.com/kaizen_nagoya/items/f000506fe1837b3590df

Qiita(0)Qiita関連記事一覧(自分)
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

鉄道(0)鉄道のシステム考察はてっちゃんがてつだってくれる
https://qiita.com/kaizen_nagoya/items/26bda595f341a27901a0

安全(0)安全工学シンポジウムに向けて: 21
https://qiita.com/kaizen_nagoya/items/c5d78f3def8195cb2409

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

Ethernet 記事一覧 Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48)
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網(Wi-Fi)空中線(antenna)(0) 記事一覧
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

OSEK OS設計の基礎 OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

プログラマによる、プログラマのための、統計(0)と確率のプログラミングとその後
https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909

官公庁・学校・公的団体(NPOを含む)システムの課題、官(0)
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

「はじめての」シリーズ  ベクタージャパン 
https://qiita.com/kaizen_nagoya/items/2e41634f6e21a3cf74eb

AUTOSAR(0)Qiita記事一覧, OSEK(75)
https://qiita.com/kaizen_nagoya/items/89c07961b59a8754c869

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

LaTeX(0) 一覧 
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

自動制御、制御工学一覧(0)
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

Rust(0) 一覧 
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

小川清最終講義、最終講義(再)計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

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

文書履歴(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

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?