2017-01-12 5 views
0

私はちょうどPythonとbs4を学び始めています。そして、私はこのようになりますhtmlページを解析しようとしています:BeautifulSoupのfindメソッドはタグ項目を返しますが、呼び出し文字列get 'NoneType'エラー

.... 
<p class="result-info"> 
    <span class="result-meta"> 
     <span class="result-price">$1895</span> 
     <span class="result-hood"> address1 </span> 
    </span> 
    .... 

私のPythonコード以下の通りです:

soup = BeautifulSoup(allResponse.content) 
    resultInfoTags = soup.find_all("p", class_="result-info") 
    infoList = [] 
    for infoTag in resultInfoTags: 
     infoDS = {} 
     infoDS['detail_link'] = infoTag.find("a")['href'] 
     for metaData in infoTag.find_all("span", class_="result-meta"): 
      firstSpan = metaData.find("span"); 
      infoDS['price'] = firstSpan.string 
      lala = metaData.find("span", class_="result-hood") 
      infoDS['area'] = lala.string 
     infoList.append(infoDS) 

エラーがラインinfoDS['area'] = lala.stringで発生します。それは

AttributeError: 'NoneType' object has no attribute 'string'

を文句を言うしかし、私はタイプ(ララ)を印刷するとき、それはララが<class 'bs4.element.Tag'>であることを示しています。私はfirstSpanを取得するために同じ考えを使用していますし、それが右の列に$ 1895を出力する任意の問題を持っていないので、私はララ自体を印刷するとき、それは全体のタグテキスト

<span class="result-hood"> (address1)</span>

を示し、私は混乱しています。しかし、それはララでは機能しません...私は必死に調査し、オンラインで検索するのに数時間を費やしましたが、役に立たないものは見つかりませんでした...

ご意見やご要望があれば幸いです!

+0

投稿すべてhtmlコードを投稿してください –

答えて

0

あなたのコードに問題があるかどうかは100%確信していませんが、実際にクラスからデータを取得する方法は間違っていると思います。通常、私が美しいスープを使用して特定のクラスを見つけるときは、別の方法を使用します。たとえば、次の方法を使用します。variable = soup.find(attrs={"class": class_name_here})とその後にvariable = variable.getText()が続きます。あなたのケースではそのため

は、次のことを試してみてください。これがそうでないなら、私に知らせて、あなたのプログラムの中で何が起こっているかである場合

soup = BeautifulSoup(allResponse.content) 
resultInfoTags = soup.find_all(attrs={"class":"result-info"}) 
infoList = [] 
for infoTag in resultInfoTags: 
    infoDS = {} 
    infoDS['detail_link'] = infoTag.find('a', href=True) 
    for metaData in infoTag.find_all(attrs={"class":"result-meta"}): 
     firstSpan = metaData.find(attrs={"class":"result-price"}) 
     infoDS['price'] = firstSpan.getText() 
     lala = metaData.find(attrs={"class":"result-hood"}) 
     infoDS['area'] = lala.getText() 
    infoList.append(infoDS) 

繰り返しますが、私は確かではありませんよ。

+0

動作しません。あなたのフォーマット 'find(attrs = {" class ":" result-hood "})に' metaData.find( "span"、class _ = "result-hood")を置き換えても、 'AttributeError: 'NoneType'オブジェクトは属性 'getText''を持っていません...私たちの異なる実装は同じように動作するはずです。私はbs4の公式ウェブサイトから 'class_'フォーマットを学びました – user3335072

0

今日は数多くの実験で幸いに理解しました。同じ問題が発生した場合は、infoDS['area'] = lala.getText()という行が問題を解決する前に、if lala is not Noneのチェックを付けないでください。 noneチェックは意味がありますが、lalaという実際の値がある場合、noneチェックがあるかどうかがコードに影響するかどうかはまだ分かりません。理由を知ってしまったら、ここで解決策/説明を残してください。非常に感謝します!

関連する問題