- 1. 概要
- 2. ソース
- 3. 修正
1. 概要
まずは、指定したコンテンツの、リンクを抽出。
2. ソース
まずは、こんなソースを書いてみました。
import sys
from urllib import request
from bs4 import BeautifulSoup
argv = sys.argv
argc = len(argv)
if (len(argv) < 2):
print("チェック対象の URL が指定されていません")
exit()
try:
html = request.urlopen(sys.argv[1])
soup = BeautifulSoup(html, "html.parser")
links = [url.get('href') for url in soup.find_all('a')]
print(links)
except Exception as ex:
print("例外[", ex.args, "]")
python ソース.py チェックURL
てな感じで、起動します。
ところが、本サイトのルートをチェックしようとしたら
例外[ (SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1134)'),) ]
てなことになっちゃった。
3. 修正
本当は、証明書は、正しいんだけど、証明書のエラーらしい。
いろいろ対策はあるようですが、「SSL 証明書が正しくないサイトに対して Python でアクセスする|Toru Kamigaki@Python|note」が一番簡単なので。
import sys
import ssl
from urllib import request
from bs4 import BeautifulSoup
argv = sys.argv
argc = len(argv)
if (len(argv) < 2):
print("チェック対象の URL が指定されていません")
exit()
try:
ssl._create_default_https_context = ssl._create_unverified_context
html = request.urlopen(sys.argv[1])
soup = BeautifulSoup(html, "html.parser")
links = [url.get('href') for url in soup.find_all('a')]
print(links)
except Exception as ex:
print("例外[", ex.args, "]")
これで、本サイトのルートをチェックすると
['./etc/', './etc/', './00/', './fbsd/', './fbsd/1301/', './fbsd/1204/', './fbsd/1302/', './desktop/', './usb/', './daily/', './linux/', './html/', './tool/', './windows/', './net/', './db/', './shell/', './solaris/', './unix/', './iphone/', './ymo/', './lang/c/', './lang/cli/', './lang/csharp/', './lang/haskell/', './lang/lua/', './lang/make/', './lang/perl/', './lang/php/', './lang/python/', './lang/ruby/', './lang/rust/', './hard/', './sitemap.html', './etc/04.html', './00/02.html', '/etc']
これは、くっきり正しく出力されました。
|