BeautifulSoupチュートリアルの最初の例 http://www.crummy.com/software/BeautifulSoup/documentation.html#QuickStart がAttributeError: 'NavigableString' object has no attribute 'name'
? この答え によると、HTMLのスペース文字が問題の原因です。私は数ページのソースを試してみましたが、他の1つは同じエラーを出しました(スペースを削除しました)。 「名前」の意味と、このエラーが発生する理由を説明できますか?ありがとう。
name
は、オブジェクトがTag
オブジェクトの場合、タグの名前を参照します(つまり:<html>
name = "html")
ノード間のマークアップにスペースがある場合、BeautifulSoupはそれらをNavigableString
に変換します。したがって、contents
のインデックスを使用してノードを取得する場合、次のNavigableString
ではなくTag
を取得する可能性があります。
これを回避するには、探しているノードに対してクエリを実行します。 解析ツリーの検索
または、必要な次のタグの名前がわかっている場合は、その名前をプロパティとして使用でき、その名前の最初のTag
を返すか、その名前の子がない場合はNone
を返します存在: メンバーとしてのタグ名の使用
contents
を使用する場合は、使用しているオブジェクトを確認する必要があります。表示されているエラーは、コードがTag
であると想定しているため、nameプロパティにアクセスしようとしていることを意味します
ツリーを反復している間は、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)
次のように、try catchを使用して、Navigable Stringがループで解析されている場合を排除できます。
for j in soup.find_all(...)
try:
print j.find(...)
except NavigableString:
pass