【问题标题】:BeautifulSoup - Get all values of an attributeBeautifulSoup - 获取属性的所有值
【发布时间】:2018-07-07 18:59:06
【问题描述】:

我有一个 HTML 标记如下:-

<div class="a b c" some-attribute="1">
    <div><div>
</div>

<div class="a b c" some-attribute="2">
    <div><div>
</div>

<div class="a b c" some-attribute="3">
    <div><div>
</div>

如何获取some-attribute的所有值的列表?

我已经尝试了足够多,但没有得到任何解决方案。

这是我尝试过的。

类似于查找所有href [a['href'] for a in soup.find_all('a', href=True)],我试过这个

[div['some-attribute'] for div in soup.find_all('div', some-attribute=True)]  # syntax error

另外,我试过了:-

links = soup.findAll('div', {'class': 'a'})
[link.get('some-attribute') for link in links]

这也行不通。

我哪里错了?或者上述问题的正确解决方案是什么?

【问题讨论】:

  • “不起作用”是什么意思?因为至少最后一个版本works when I try it.
  • 第一个不起作用的唯一原因是 some-attribute 不是有效的 Python 标识符。帮助说明了处理该问题的两种方法,但由于您已经在下次尝试中使用了这两种方法中的一种,因此您应该已经知道了。
  • @abarnert - 2 种方式。还有什么办法?
  • 将该属性键值对转换为 dict 并直接传递该 dict,或者将所有属性键值对(在本例中,只有一个)组合成可以与 @987654329 一起使用的东西@.
  • 同时,您是否阅读过the help,或者您是否试图通过查看您在网上找到的随机示例来猜测规则?

标签: python web-scraping beautifulsoup


【解决方案1】:

使用 dict 查找所有 div:soup.find_all('div', {"some-attribute" : True})

[x.get_attribute_list('some-attribute') for x in soup.find_all('div', {"some-attribute" : True})]

输出:

[['1'], ['2'], ['3']]

扁平化列表或您需要的任何内容。

【讨论】:

    【解决方案2】:

    您可以使用has_attr("some-attribute") 来检查标签是否有您的属性。

    演示:

    s = """<div class="a b c" some-attribute="1">
        <div><div>
    </div>
    
    <div class="a b c" some-attribute="2">
        <div><div>
    </div>
    
    <div class="a b c" some-attribute="3">
        <div><div>
    </div>
    
    <div class="a b c">
        <div><div>
    </div>"""
    
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(s, "html.parser")
    res = [i.attrs["some-attribute"] for i in soup.find_all("div", class_ = "a b c") if i.has_attr("some-attribute")]
    print(res)
    

    输出:

    [u'1', u'2', u'3']
    

    【讨论】:

      【解决方案3】:

      您可以指定要搜索的div类:

      import re
      vals = [i['some-attribute'] for i in soup(content, 'html.parser').find_all('div', {'class':re.compile('someclass\d+')})]
      

      输出:

      ['1', '2', '3']
      

      【讨论】:

      • re.compile 有什么作用?
      • 另外,请参阅更新后的问题。我已经更新了类属性的值。
      猜你喜欢
      • 2020-09-15
      • 2016-09-19
      • 2018-11-05
      • 2013-09-14
      • 2015-08-28
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多