Python: BeautifulSoup - получить значение атрибута на основе атрибута имени

Я хочу напечатать значение атрибута на основе его имени, например

<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, поэтому его нельзя использовать аргумент ключевого слова.

68 голосов | спросил Ruth 26 J0000006Europe/Moscow 2012, 14:29:43

6 ответов


0

Это довольно просто, используйте следующее -

>>> 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 26 J0000006Europe/Moscow 2012, 14:51:26
0

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
ответил Delicious 12 MarpmWed, 12 Mar 2014 21:56:56 +04002014-03-12T21:56:56+04:0009 2014, 21:56:56
0

Ответ theharshest - лучшее решение, но, к вашему сведению, проблема, с которой вы столкнулись, связана с тем, что объект Tag в Beautiful Soup действует как словарь Python. Если вы получите доступ к тегу ['name'] для тега, который не имеет атрибута 'name', вы получите KeyError.

ответил Leonard Richardson 26 J0000006Europe/Moscow 2012, 16:18:24
0

Следующие работы:

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']
ответил BrightMoon 23 MarpmThu, 23 Mar 2017 23:40:16 +03002017-03-23T23:40:16+03:0011 2017, 23:40:16
0

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']

Надеюсь, это поможет кому-то еще!

ответил ron g 10 PMpTue, 10 Apr 2018 18:53:15 +030053Tuesday 2018, 18:53:15
0

Можно также попробовать это решение:

Найти значение, которое записано в интервале таблицы

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
ответил Ujjaval Moradiya 20 +03002016-10-20T08:38:11+03:00312016bEurope/MoscowThu, 20 Oct 2016 08:38:11 +0300 2016, 08:38:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132