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

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

新規登録して質問してみよう
ただいま回答率
85.83%
Python 3.x

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

Python

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

Q&A

受付中

urllib.error.HTTPError: HTTP Error 404: Not Found の解決策

ponpon0987
ponpon0987

総合スコア17

Python 3.x

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

Python

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

2回答

0グッド

0クリップ

11744閲覧

投稿2018/11/12 03:27

編集2018/11/12 04:47

前提・実現したいこと

自分のブログの内部リンクを自動で可視化するために、python3を用いているのですが、
エラーが発生しているので、解決策を教えて欲しいです。

発生している問題・エラーメッセージ

$ python3 link_network.py --url URL(自分のブログ) --savename procrasist -g Traceback (most recent call last): File "link_network.py", line 77, in <module> urls = extract_url(args.url) File "link_network.py", line 21, in extract_url html = request.urlopen(root_url+"/archive?page={}".format(page)) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 222, in urlopen return opener.open(url, data, timeout) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 531, in open response = meth(req, response) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 641, in http_response 'http', request, response, code, msg, hdrs) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 569, in error return self._call_chain(*args) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 503, in _call_chain result = func(*args) File "/Library/Frameworks/Python.framework/Versions/3.7/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

該当のソースコード

from bs4 import BeautifulSoup import urllib from urllib import request import time import csv import os import numpy as np import time from argparse import ArgumentParser import networkx as nx import matplotlib.pyplot as plt def extract_url(root_url): page = 1 is_articles = True urls = [] entry_url = root_url + "/entry/" while is_articles: html = request.urlopen(root_url+"/page/page={}".format(page)) soup = BeautifulSoup(html, "html.parser") articles = soup.find_all("a",class_="sidelong__link") for article in articles: urls.append(article.get("href")) if len(articles) == 0: # articleがなくなったら終了 is_articles = False page += 1 return urls def make_network(root_url, urls): entry_url = root_url + "/entry/" G = nx.Graph() for url in urls: article_name= url.replace(entry_url,"").replace("/","-") G.add_node(article_name) for i,url in enumerate(urls): print(i+1,"/",len(urls)) try: html = request.urlopen(url) except urllib.error.HTTPError as e: print(e.reason) except urllib.error.URLError as e: print(e.reason) soup = BeautifulSoup(html, "html.parser") entry = soup.select(".entry-content")[0] links = entry.find_all("a") for link in links: l = link.get("href") if l in urls: linking_article_name = url.replace(entry_url,"").replace("/","-") linked_article_name = l.replace(entry_url,"").replace("/","-") print("被リンク!{} -> {}".format(linking_article_name, linked_article_name)) j = urls.index(l) G.add_edge(linking_article_name, linked_article_name) else: continue return G def visualize(G, savename, savegml): pos = nx.spring_layout(G) # グラフ形式を選択。ここではスプリングモデルでやってみる nx.draw(G, pos, with_labels=True,alpha=0.3,font_size=0.0,node_size=10) # グラフ描画。 オプションでノードのラベル付きにしている plt.savefig(savename+".png") plt.show() if savegml: nx.write_gml(G,savename+".gml") if __name__ == '__main__': parser = ArgumentParser() parser.add_argument("-u", "--url", type=str, required=True,help="input your url") parser.add_argument("-o", "--savename", type=str, default="network", help="output name") parser.add_argument('-g', "--savegml", action="store_true", default=False) args = parser.parse_args() urls = extract_url(args.url) G = make_network(args.url, urls) visualize(G, args.savename, args.savegml)

試したこと

ご指摘通り、URL+のあとが間違っておりました。
なので、ソースコードは自分のブログは"URL+/page/0"と表示されていたので、修正させて頂きました。
また、class名も自分のブログ用に変更させて頂きました。
しかし、また実行したところ、エラーは直りませんでした。
その他に変更しなければならないと思う点はentry_urlと思っています。
私のブログの場合、各記事に移動すると
ブログのURL/数値になってしまっているためこのソースコードがつかえないと思っています。
この場合、wordpressを用いて、ブログのurlを/entry/タイトル名などに変更してこのソースコードを使うのが得策だと思うのですが、
できればサイトURLを変更せずにソースコードをいじって、活用したいです。
なにか案があれば教えて頂きたいです。

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

can110

2018/11/12 03:54

ブラウザから「あなたのブログURL/archive?page=1」にアクセスできますか?
ponpon0987

2018/11/12 04:48

できませんでした。修正致しました。

回答2

0

とりあえずprintデバッグしてみると良いでしょう。

python

1 while is_articles: 2 print(root_url+"/archive?page={}".format(page)) # urlopenに渡るURLを見てみる 3 html = request.urlopen(root_url+"/archive?page={}".format(page))

投稿2018/11/12 04:08

hayataka2049

総合スコア30913

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

メッセージのとおりあなたのブログURL/archive?page=1というページが存在しないのではないでしょうか?
例えばあなたのブログURL/index/2といったページ構成なら、それに対応したコードに修正する必要があります。

投稿2018/11/12 03:58

can110

総合スコア37420

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

ponpon0987

2018/11/12 04:49

修正して試したことに補足説明させて頂きました。
can110

2018/11/12 05:26

元コードの対象ブログとはページ構成(ページネーション)が大幅に異なるようですね。詳細確認できていませんが、おそらくコードの大部分の修正が必要だと思います…

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.83%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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

Python

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