Python: BeautifulSoup - Ermittelt einen Attributwert basierend auf dem Namensattribut

89

Ich möchte einen Attributwert basierend auf seinem Namen drucken, zum Beispiel

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

Ich möchte so etwas tun

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

Der obige Code gibt ein KeyError: 'name', ich glaube, das liegt daran, dass der Name von BeatifulSoup verwendet wird und daher nicht als Schlüsselwortargument verwendet werden kann.

Ruth
quelle

Antworten:

152

Es ist ziemlich einfach, verwenden Sie die folgenden -

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

Hinterlasse einen Kommentar, wenn etwas nicht klar ist.

theharshest
quelle
1
Wie kann ich das tun, wenn ich alle Instanzen finden möchte, dh im Moment gibtoup.find ("meta", {"name": "City"}) ['content'] das erste Ergebnis, aber sagen, es gab noch eine andere Zeile in der Suppe, die <META NAME = 'City "content =" San Francisco "> war. Wie könnte ich den Code so ändern, dass ich' Austin 'und' San Francisco 'bekomme?
Überlaufname
1
Alte Frage, aber hier ist eine einfache Lösung für den Fall, dass jemand anderes danach sucht : soup.findAll("meta", {"name":"City"})['content']. Dies gibt alle Vorkommen zurück.
Hannon César
Wie kann ich den Wert eines bestimmten Attributs ermitteln? bedeutet, ich habe nur Attribut ...
Phaneendra Charyulu Kanduri
27

theharshest beantwortete die Frage, aber hier ist eine andere Möglichkeit, dasselbe zu tun. Außerdem haben Sie in Ihrem Beispiel NAME in Großbuchstaben und in Ihrem Code Namen in Kleinbuchstaben.

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
Köstlich
quelle
Die Nichtübereinstimmung in diesem Fall ist wahrscheinlich beabsichtigt, da BeautifulSoup Tags standardmäßig in Kleinbuchstaben konvertiert. In diesem Fall: BeautifulSoup ('<META NAME = "City" content = "Austin">') gibt <meta content = "Austin" name = "City" /> zurück
tuckermi
9

6 Jahre zu spät zur Party, aber ich habe gesucht, wie man den Tag- Attributwert eines HTML-Elements extrahiert , also für:

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

Ich möchte "addressLocality". Ich wurde immer wieder hierher zurückgeleitet, aber die Antworten lösten mein Problem nicht wirklich.

Wie ich es schließlich geschafft habe:

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

Da es ein Diktat ist, können Sie dann auch keysund 'Werte' verwenden.

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

Hoffentlich hilft es jemand anderem!

donrondadon
quelle
8

Folgendes funktioniert:

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']
Strahlender Mond
quelle
7

Die Antwort von theharshest ist die beste Lösung, aber zu Ihrer Information, das Problem, auf das Sie gestoßen sind, hat damit zu tun, dass sich ein Tag-Objekt in Beautiful Soup wie ein Python-Wörterbuch verhält. Wenn Sie auf das Tag ['name'] eines Tags zugreifen, das kein 'name'-Attribut hat, erhalten Sie einen KeyError.

Leonard Richardson
quelle
1

Man kann auch diese Lösung ausprobieren:

Um den Wert zu finden, der in der Tabelle geschrieben ist

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


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
quelle
0
If tdd='<td class="abc"> 75</td>'
In Beautifulsoup 

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


Result:  abc
Priyank Singhal
quelle
1
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Shaunakde