web-dev-qa-db-ja.com

BeautifulSoup:AttributeError: 'NavigableString' object has no attribute 'name'

BeautifulSoupチュートリアルの最初の例 http://www.crummy.com/software/BeautifulSoup/documentation.html#QuickStartAttributeError: 'NavigableString' object has no attribute 'name'この答え によると、HTMLのスペース文字が問題の原因です。私は数ページのソースを試してみましたが、他の1つは同じエラーを出しました(スペースを削除しました)。 「名前」の意味と、このエラーが発生する理由を説明できますか?ありがとう。

19
Zeynel

nameは、オブジェクトがTagオブジェクトの場合、タグの名前を参照します(つまり:<html> name = "html")

ノード間のマークアップにスペースがある場合、BeautifulSoupはそれらをNavigableStringに変換します。したがって、contentsのインデックスを使用してノードを取得する場合、次のNavigableStringではなくTagを取得する可能性があります。

これを回避するには、探しているノードに対してクエリを実行します。 解析ツリーの検索

または、必要な次のタグの名前がわかっている場合は、その名前をプロパティとして使用でき、その名前の最初のTagを返すか、その名前の子がない場合はNoneを返します存在: メンバーとしてのタグ名の使用

contentsを使用する場合は、使用しているオブジェクトを確認する必要があります。表示されているエラーは、コードがTagであると想定しているため、nameプロパティにアクセスしようとしていることを意味します

20
MattoTodd

ツリーを反復している間は、NavigableStringオブジェクトを無視するだけです。

response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

for body_child in soup.body.children:
    if isinstance(body_child, NavigableString):
        continue
    if isinstance(body_child, Tag):
        print(body_child.name)
7
Max Malysh

次のように、try catchを使用して、Navigable Stringがループで解析されている場合を排除できます。

    for j in soup.find_all(...)
        try:
            print j.find(...)
        except NavigableString: 
            pass
7
Tomarinator