web-dev-qa-db-ja.com

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

79
Ruth

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

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

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

131
theharshest

theharshestは質問に答えましたが、同じことを行う別の方法があります。また、あなたの例では、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
23
Delicious

以下の作品:

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

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

7

パーティーに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']

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

7
ron g

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

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

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