Python:BeautifulSoup-根据名称属性获取属性值


90

我想根据属性名称打印属性值,例如

<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使用了name,因此它不能用作关键字参数。

Answers:


153

这很简单,请使用以下代码-

>>> 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“>。我如何修改代码以便得到'Austin'和'San Francisco'?
溢出名称

1
老问题,但在这里是万一别人一个简单的解决方案来寻找它:soup.findAll("meta", {"name":"City"})['content']。这将返回所有事件。
HannonCésar18年

如何获得特定属性的值?意味着我只有属性...
Phaneendra Charyulu Kanduri '19

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元素的tag 属性值,因此:

<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

最棘手的答案是最好的解决方案,但仅供参考,您遇到的问题与“ Beautiful Soup”中的Tag对象的行为就像Python字典一样。如果访问不具有“名称”属性的标签上的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
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
shaunakde
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.