Python: BeautifulSoup-получить значение атрибута на основе атрибута name
Я хочу напечатать значение атрибута на основе его имени, например
<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 поэтому он не может быть использован в качестве ключевого аргумента.
6 ответов:
Это довольно просто, используйте следующее -
>>> 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 ответили на вопрос, но вот еще один способ сделать то же самое. Кроме того, в вашем примере у вас есть имя в шапках, а в вашем коде у вас есть имя в нижнем регистре.
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
ответ theharshest является лучшим решением, но FYI проблема, с которой вы столкнулись, связана с тем, что объект Tag в Beautiful Soup действует как словарь Python. Если вы получаете доступ к тегу ['name'] на теге, который не имеет атрибута' name', вы получите KeyError.
следующие работы:
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']
6 лет опоздал на вечеринку, но я искал как извлечь тег html элементаатрибут value, так:
<span property="addressLocality">Ayr</span>
Я хочу "адресность". Меня продолжали направлять сюда, но ответы на самом деле не решали мою проблему.
как мне удалось это сделать в итоге:
>>> 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>
код
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