15の投稿主と同様と思われる事象が発生しました。
大変お手数ですが、原因が分かれば教えて頂きたく。
【①発生した事象】
以下プログラムの以下箇所でエラーが発生しました。
https://github.com/kujirahand/book-python-scraping/blob/master/ch1/sel-avocado.py
print(soup.select_one("li:nth-of-type(8)").string) #(1)
エラー内容は以下になります。
AttributeError: NoneType object has no attribute string
※シングルクォーテーションを書くと掲示板書き込みエラーになったため省略しています。
【②事象発生後確認したこと】
1)エラーとなる行を外したら、書籍と同じ結果が得られました。
2)エラーとなる部分のnth-of-typeの値を変えた際は以下の結果になりました。
※print(soup.select_one("li:nth-of-type(〇)").string)
→〇の部分を書き換えた結果。
1 → リンゴ
2 → ブドウ
3 → レモン
4 → オレンジ
5 → レンコン
6~8 → ①に記載と同じエラー
本来、5を指定したら「ダイコン」が返ってくるのが想定の結果だと思うのですが、「レンコン」が返ってきてしまっており、その原因が分からないです。
【③バージョン】
Python3.7.4
【④使用しているHTMLファイル】
Githubから取得したので、問題ないと思いますが、HTMLファイルについて下記します。
---------------
<html><body>
<div id="main-goods" role="page">
<h1>フルーツや野菜</h1>
<ul id="fr-list">
<li class="red green" data-lo="jp">リンゴ</li>
<li class="purple" data-lo="us">ブドウ</li>
<li class="yellow" data-lo="us">レモン</li>
<li class="yellow" data-lo="jp">オレンジ</li>
</ul>
<ul id="ve-list">
<li class="white green" data-lo="jp">ダイコン</li>
<li class="red green" data-lo="us">パプリカ</li>
<li class="black" data-lo="jp">ナス</li>
<li class="black" data-lo="us">アボカド</li>
<li class="white" data-lo="cn">レンコン</li>
</ul>
</div>
<body></html>
-------------
大変お手数ですが、もしお気づきの点があればアドバイスをいただきたく、宜しくお願い申し上げます。
調べて見ると、BeautifulSoupが不安定のようです。
そこで、BeautifulSoup4では、なるだけ、nth-of-typeを使わないようにすると良いと思います。
ご報告ありがとうございました。
以前のバージョンのBeautifulSoup4の『nth-of-type(n)』では、問題なかったのですが、最近のBeautifulSoup4では、動作が不安定なようです。
(参考)https://d.aoikujira.com/bbs/mbbs.php?m=thread&threadid=19
そこで、『nth-of-type(n)』を使わず、select("li")のように書くと良いでしょう。
- [x] print(soup.select_one("li:nth-of-type(8)").string) #(1)
- [o] print(soup.select("li")[7].string) #(1)
ご返信が遅くなり申し訳ございません。
エラーなく実行することが出来ました。
どうもありがとうございます。
ステータスを変更させて頂きました。
(もし、変更NGであれば申し訳ございません)