名前に基づいて属性値を印刷したい、例えば
<META NAME="City" content="Austin">
このようなことをしたい
soup = BeautifulSoup(f) //f is some HTML containing the above meta tag
for meta_tag in soup('meta'):
if meta_tag['name'] == 'City':
print meta_tag['content']
上記のコードはKeyError: 'name'
を提供します。これは、名前がBeatifulSoupで使用されているため、キーワード引数として使用できないためと考えられます。
それは非常に簡単です、次を使用してください-
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<META NAME="City" content="Austin">')
>>> soup.find("meta", {"name":"City"})
<meta name="City" content="Austin" />
>>> soup.find("meta", {"name":"City"})['content']
u'Austin'
不明な点がある場合はコメントを残してください。
theharshestは質問に答えましたが、同じことを行う別の方法があります。また、あなたの例では、NAMEが大文字で、コードでは名前が小文字です。
s = '<div class="question" id="get attrs" name="python" x="something">Hello World</div>'
soup = BeautifulSoup(s)
attributes_dictionary = soup.find('div').attrs
print attributes_dictionary
# prints: {'id': 'get attrs', 'x': 'something', 'class': ['question'], 'name': 'python'}
print attributes_dictionary['class'][0]
# prints: question
print soup.find('div').get_text()
# prints: Hello World
以下の作品:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<META NAME="City" content="Austin">', 'html.parser')
metas = soup.find_all("meta")
for meta in metas:
print meta.attrs['content'], meta.attrs['name']
theharshestの答えが最善の解決策ですが、あなたが遭遇した問題は、Beautiful SoupのTagオブジェクトがPython辞書のように振る舞うという事実に関係しています。 'name'属性を持たないタグでtag ['name']にアクセスすると、KeyErrorが発生します。
パーティーに6年遅れましたが、html要素のタグ属性値を抽出する方法を探していました。 :
<span property="addressLocality">Ayr</span>
「addressLocality」が必要です。私はここに戻され続けましたが、答えは私の問題を本当に解決しませんでした。
最終的にそれをどうやってやったのか:
>>> from bs4 import BeautifulSoup as bs
>>> soup = bs('<span property="addressLocality">Ayr</span>', 'html.parser')
>>> my_attributes = soup.find().attrs
>>> my_attributes
{u'property': u'addressLocality'}
それは辞書なので、keys
と 'values'を使用することもできます
>>> my_attributes.keys()
[u'property']
>>> my_attributes.values()
[u'addressLocality']
うまくいけば、それは他の誰かを助ける!
このソリューションを試すこともできます:
テーブルのスパンに書き込まれている値を見つける
htmlContent
<table>
<tr>
<th>
ID
</th>
<th>
Name
</th>
</tr>
<tr>
<td>
<span name="spanId" class="spanclass">ID123</span>
</td>
<td>
<span>Bonny</span>
</td>
</tr>
</table>
Pythonコード
soup = BeautifulSoup(htmlContent, "lxml")
soup.prettify()
tables = soup.find_all("table")
for table in tables:
storeValueRows = table.find_all("tr")
thValue = storeValueRows[0].find_all("th")[0].string
if (thValue == "ID"): # with this condition I am verifying that this html is correct, that I wanted.
value = storeValueRows[1].find_all("span")[0].string
value = value.strip()
# storeValueRows[1] will represent <tr> tag of table located at first index and find_all("span")[0] will give me <span> tag and '.string' will give me value
# value.strip() - will remove space from start and end of the string.
# find using attribute :
value = storeValueRows[1].find("span", {"name":"spanId"})['class']
print value
# this will print spanclass