Python:BeautifulSoup-名前属性に基づいて属性値を取得する


91

たとえば、名前に基づいて属性値を出力したい

<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によって使用されるため、キーワード引数として使用できないためと考えられます。

回答:


154

それは非常に簡単です、次を使用してください-

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

不明な点がある場合はコメントを残してください。


1
すべてのインスタンスを検索する場合、つまり、今のところ、soup.find( "meta"、{"name": "City"})['content']は最初の結果を与えますが、別の<META NAME = 'City "content =" San Francisco ">だったスープの行です。コードを変更して「オースティン」と「サンフランシスコ」を取得するにはどうすればよいですか?
overflowname

1
古い質問ですが、他の誰かがそれを探しに来た場合の簡単な解決策は次のとおりsoup.findAll("meta", {"name":"City"})['content']です。これはすべてのオカレンスを返します。
ハノンセザール

特定の属性の値を取得するにはどうすればよいですか?私は唯一の属性を持っている手段...
Phaneendra Charyulu Kanduri

27

最も厳しい質問に答えましたが、同じことを行う別の方法があります。また、あなたの例では大文字で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

BeautifulSoupはデフォルトでタグを小文字に変換するため、大文字と小文字の不一致はおそらく意図的なものです。この場合:BeautifulSoup( '<META NAME = "City" content = "Austin">')は<meta content = "Austin" name = "City" />を返します
tuckermi

9

パーティーには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「値」を使うことができます

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

うまくいけば、それは他の誰かを助けるでしょう!


8

以下の作品:

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

7

theharshestの答えが最善の解決策ですが、発生した問題は、Beautiful SoupのTagオブジェクトがPython辞書のように機能するという事実に関係しています。'name'属性を持たないタグでtag ['name']にアクセスすると、KeyErrorが発生します。


1

このソリューションを試すこともできます:

テーブルのスパンに書かれている値を見つける

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

1
If tdd='<td class="abc"> 75</td>'
In Beautifulsoup 

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


Result:  abc

1
このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
シャナクデ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.