yuhtaryouko
@yuhtaryouko (Yuta Kato)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

argument of type 'NoneType' is not iterable エラーについて

解決したいこと

argument of type 'NoneType' is not iterableというエラーが発生しています。

あるホームページの2ページ目から10ページ目までにある、特定の単語を含んだURLを集めようとしています。

発生している問題・エラー

argument of type 'NoneType' is not iterable

該当するソースコード

import requests
from time import sleep
from bs4 import BeautifulSoup as bs

url = 'https:xxxxxx//{}/xxxxx'
links = []

for i in range(2,10):
    target_url = url.format(i)
    r = requests.get(target_url)
    sleep(2)
    
    soup = bs(r.text, 'html.parser')
    a_tags = soup.find_all('a') #aタグを取得

    
    for a_tag in a_tags:
        link = a_tag.get('href')
        links.append(link)



target_links = []

for target_link in links:
    if 'xxxxx' in target_link:
        print(target_link) #ひとつひとつのリンクを目視したいので入れてます
        t_links.append(target_link)

ここで、if 'xxxxxx' in target_link': の部分に関して上記のエラーが出てきてしまいます。

自分で試したこと

関数に戻り値が設定されていないと None type というものになってしまうので、それが原因だということは分かりました。
ですが、昨日までこれと同じような流れのコードを書いていたのですがうまく動いていたのが急にエラーになったのでよくわかりません。

正直なところ

  for a_tag in a_tags:
link = a_tag.get('href')
links.append(link)

このfor文はエラーが出ないのに、なぜ2つ目のfor文はエラーが出るのか見当がつきません。
関数の戻り値という概念を調べてみましたが、自分の場合はどこに戻り値を設定すればよいのか…

よろしくお願いいたします。

1

1Answer

最後の行の t_links 変数は未定義なのでうまく動くことはないと思いますが……

そのエラーは if 'xxxxx' in target_linktarget_linkNone のときに起きます。まず、ここの inA in B の形の二項演算子であり、 for ... in 構文とは別物なことに注意してください。

in 演算子は A が B に含まれることをテストします。ここで A と B は共に文字列であるか、または B が iterable (リストのように複数の値を格納して順に取り出せる構造)である必要があります。しかし B にあたる target_link はどちらでもない None なので、エラーが出ているわけです。

ここの target_linkfor target_link in links:links リストから取り出した値です。 links は以下の部分で組み立てています:

     for a_tag in a_tags:
        link = a_tag.get('href')
        links.append(link)

a_tag.get('href') の戻り値が None なせいで linksNone が追加されています。ページに href 属性を持たない a 要素があるということでしょう。

linksNone を入れないようにするには以下のように if でチェックしてください:

     for a_tag in a_tags:
        link = a_tag.get('href')
        if link is not None:
            links.append(link)
0Like

Comments

  1. @yuhtaryouko

    Questioner

    ご助言ありがとうございます!!この通りにやったらできました。各種変数の要素なども細かく教えてくださり、とても勉強になりました。本当にありがとうございました!

Your answer might help someone💌