2017-12-17 36 views
1

私はかなり理解できない奇妙な振る舞いをしています。私は、誰かが何が起こっているのかを説明できることを望んでいます。Python Beautiful Soup HTMLメタデータを抽出する

は、このメタデータを考えてみましょう:

<meta property="og:title" content="This is the Tesla Semi truck"> 
<meta name="twitter:title" content="This is the Tesla Semi truck"> 

この行が正常にALL "OG" プロパティを検索し、リストを返します。

opengraphs = doc.html.head.findAll(property=re.compile(r'^og')) 

しかし、この行は、Twitterのカードで同じことをすることができません。

twitterCards = doc.html.head.findAll(name=re.compile(r'^twitter')) 

なぜ、最初の行がすべての「og」(opengraphカード)を見つけたのですか?しかし、Twitterカードを見つけることができませんでしたか?

答えて

2

問題は特別な意味を持つname=です。タグ名を検索するために使用されている - あなたのコードでは、それはあなたが"meta"を追加し、さまざまなアイテムと"name"

例で辞書を使用する必要がmeta

です。

from bs4 import BeautifulSoup 
import re 

data=''' 
<meta property="og:title" content="This is the Tesla Semi truck"> 
<meta property="twitter:title" content="This is the Tesla Semi truck"> 
<meta name="twitter:title" content="This is the Tesla Semi truck"> 
''' 

head = BeautifulSoup(data) 

print(head.findAll(property=re.compile(r'^og'))) # OK 
print(head.findAll(property=re.compile(r'^tw'))) # OK 

print(head.findAll(name=re.compile(r'^meta'))) # OK 
print(head.findAll(name=re.compile(r'^tw'))) # empty 

print(head.findAll('meta', {'name': re.compile(r'^tw')})) # OK 
+0

ありがとう、あなたの最後の提案は完璧に働いた! –

3

nameは基本的にこの場合BeautifulSouptwitterで始まるタグ名を持つ要素を探しますことを意味し、タグ名引数の名前であるためです。あなたが実際に属性を意味することを指定するために

は、使用:

doc.html.head.find_all(attrs={'name': re.compile(r'^twitter')}) 

あるいは、CSS selector経由:

doc.html.head.select("[name^=twitter]") 

^=手段は、 "で始まります"。

+0

ありがとうございます!私は両方の答えを受け入れることができたら私は持っていただろう! –

関連する問題