Python: BeautifulSoup - obtenha um valor de atributo com base no atributo name

91

Eu quero imprimir um valor de atributo com base em seu nome, por exemplo

<META NAME="City" content="Austin">

Eu quero fazer algo assim

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

O código acima fornece um KeyError: 'name', acredito que isso seja porque o nome é usado por BeatifulSoup, portanto, não pode ser usado como um argumento de palavra-chave.

Ruth
fonte

Respostas:

154

É muito simples, use o seguinte -

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

Deixe um comentário se algo não estiver claro.

o mais severo
fonte
1
como posso fazer isso se quiser encontrar todas as instâncias, ou seja, agora, soup.find ("meta", {"name": "City"}) ['content'] fornece o primeiro resultado, mas digamos que houvesse outro linha na sopa que era <META NAME = 'City "content =" San Francisco ">. como eu poderia modificar o código para obter' Austin 'e' San Francisco '?
overflowname
1
Velha questão, mas aqui está uma solução simples no caso de alguém vier procurá-lo: soup.findAll("meta", {"name":"City"})['content']. Isso retornará todas as ocorrências.
Hannon César
como posso obter o valor de um atributo específico? significa que eu tenho apenas o atributo ...
Phaneendra Charyulu Kanduri
27

o mais duro respondeu à pergunta, mas aqui está outra maneira de fazer a mesma coisa. Além disso, em seu exemplo, você tem NAME em letras maiúsculas e em seu código o nome em letras minúsculas.

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
Delicioso
fonte
A incompatibilidade de maiúsculas e minúsculas provavelmente é intencional porque BeautifulSoup converte as tags em minúsculas por padrão. Neste caso: BeautifulSoup ('<META NAME = "City" content = "Austin">') retorna <meta content = "Austin" name = "City" />
tuckermi
9

6 anos atrasado para a festa, mas tenho pesquisado como extrair o valor do atributo de tag de um elemento html , para:

<span property="addressLocality">Ayr</span>

Eu quero "addressLocality". Continuei sendo direcionado de volta para cá, mas as respostas não resolveram realmente meu problema.

Como consegui fazer isso eventualmente:

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

Como é um ditado, você também pode usar keyse 'valores'

>>> my_attributes.keys()
[u'property']
>>> my_attributes.values()
[u'addressLocality']

Espero que ajude outra pessoa!

ron_g
fonte
8

O seguinte funciona:

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']
Lua brilhante
fonte
7

a resposta do theharshest é a melhor solução, mas, para sua informação, o problema que você estava encontrando tem a ver com o fato de que um objeto Tag em Beautiful Soup age como um dicionário Python. Se você acessar a tag ['nome'] em uma tag que não tem um atributo 'nome', você receberá um KeyError.

Leonard Richardson
fonte
1

Também se pode tentar esta solução:

Para encontrar o valor, que está escrito na extensão da tabela

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>

Código 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
fonte
1
If tdd='<td class="abc"> 75</td>'
In Beautifulsoup 

if(tdd.has_attr('class')):
   print(tdd.attrs['class'][0])


Result:  abc
Priyank Singhal
fonte
1
Embora este código possa responder à pergunta, fornecer contexto adicional sobre como e / ou por que ele resolve o problema melhoraria o valor da resposta a longo prazo.
shaunakde