スクレーパーの論理フロー:XMLフィードから抽出された記事のリンクは、self.raw_htmlというリストに入れられます。次に、次の[簡略化された]メソッドが呼び出されて、記事が含まれているコンテナーがフィルターで除外され、指定された記事からテキストが削除されます。
def fetch_article_contents(self):
for article in self.raw_html:
self.css_selector_type == 'class':
soup = article.find(self.html_element,
self.css_selector)
soup = soup.get_text()
self.article_html.append(soup)
return self.article_html
これはほとんどのフィードでうまく機能しますが、get_text()が呼び出されると、2つの注目すべき例外(Forbesと公式Googleブログ)が失敗し、次のメッセージが表示されます。
AttributeError: 'NoneType' object has no attribute 'get_text'
デバッグの最初の論理的な手順は、NoneTypeオブジェクトを返すものを確認することだったので、print type(soup)
直前にスタックしましたsoup = soup.get_text()
。私が見つけた:
<class 'bs4.element.Tag'> (25 times, condensed to save space)
<type 'NoneType'>
self.raw_html
クラスが初期化されたときにlen(self.raw_html)によって検証されたように、Forbes XMLフィードをフェッチするときに現在29の記事があるので、これも奇妙なことに思います。
Google公式ブログは以下を返します:
<class 'bs4.element.Tag'> (just once this time)
<type 'NoneType'>
実際には、25のフェッチされた記事があります。
私が直面している問題は何ですか?ありがとう!