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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Beautiful Soup

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

Python

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

Q&A

解決済

1回答

206閲覧

python_'NoneType' object has no attribute 'find'_スクレイピングでループできない

MTL

総合スコア6

Beautiful Soup

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

Python

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

0グッド

0クリップ

投稿2024/07/26 04:29

実現したいこと

一つのURL(OpenURL=親URL)を入力すると、そのURL内にあるリンク先を全て取得する。
なお、取得するURLは親URLを含んでいる(外部リンクのURLは取得しない)。
この操作を、全てのリンク先のURLで行い、
結果的に親URLに紐づく子URL全てを取得することが出来る。

発生している問題・分からないこと

while処理中、i=1となったときに
「if url.find(OpenURL)==0:」の箇所で
'NoneType' object has no attribute 'find'
のエラーが発生する

該当のソースコード

python

1#https://programmer-life.work/python/get-child-href 2import requests, bs4 3import re 4 5#https://atmarkit.itmedia.co.jp/ait/articles/2401/30/news027.html 6def remove_repetition(iterable): 7 result = [] 8 for item in iterable: 9 if item not in result: 10 result.append(item) 11 return result 12 13OpenURL='https://tonari-it.com' 14res = requests.get(OpenURL) 15OutputToCSV=[OpenURL] 16 17i=0 18while True: 19 soup = bs4.BeautifulSoup(requests.get(OutputToCSV[i]).text, "html.parser") 20 list=[] 21 for element in soup.find_all("a"): 22 url = element.get("href") 23 if url.find(OpenURL)==0: 24 list.append(url) 25 list=remove_repetition(list) 26 OutputToCSV.extend(list) 27 OutputToCSV = remove_repetition(OutputToCSV) 28 if len(OutputToCSV)>100:#強制的に停止する数 29 OutputToCSV.append("continue") 30 break 31 if OutputToCSV[i]==OutputToCSV[-1]:#末尾まで来たらBraek 32 break 33 i+=1 34 35 36print(OutputToCSV)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果
  1. 親URLを別のURL(https://tonari-it.com/profile/)に変更したところ、i=0のタイミングでも同様のエラーが発生した
  2. time.sleep(10)を処理途中に追加しても同様の事象が発生した

補足

特になし

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

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

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

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

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

melian

2024/07/26 07:24

href 属性を持たない a 要素があるのだと思います。その様な a 要素はスキップして次の要素に進むとよいかと。 for element in soup.find_all("a"):  url = element.get("href")  if url is None: continue # href 属性を持たない a 要素はスキップ  if url.find(OpenURL)==0:   list.append(url)
MTL

2024/07/26 12:18 編集

解決しました!!!!!ありがとうございます!!!! これは質問と外れてしまうのですが この事象を考えると、もともと親URLで指定していた「https://tonari-it.com」には hrefを持たないa要素がないため たまたまi=0は通ってしまった ということになるのでしょうか? (該当URLのHTMLをちゃんと調べたわけではないので、状況から推察するに……ですが)
melian

2024/07/26 13:08

> hrefを持たないa要素がないためたまたまi=0は通ってしまった はい、その通りです。
guest

回答1

0

自己解決

melianさんに記載いただきました

href 属性を持たない a 要素があるのだと思います。その様な a 要素はスキップして次の要素に進むとよいかと。
引用テキスト
for element in soup.find_all("a"):
url = element.get("href")
if url is None: continue # href 属性を持たない a 要素はスキップ
if url.find(OpenURL)==0:
list.append(url)

投稿2024/07/29 10:45

MTL

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問