【问题标题】:BeautifulSoup - How to find a specific class name aloneBeautifulSoup - 如何单独查找特定的类名
【发布时间】:2018-03-05 19:39:44
【问题描述】:

如何找到具有特定类名的li 标签而不是其他标签?例如:

...
<li> no wanted </li>
<li class="a"> not his one </li>
<li class="a z"> neither this one </li>
<li class="b z"> neither this one </li>
<li class="c z"> neither this one </li>
...
<li class="z"> I WANT THIS ONLY ONE</li>
...

代码:

bs4.find_all ('li', class_='z') 返回多个条目,其中有一个 "z" 和另一个类名。

如何单独找到类名"z"的条目?

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    您可以使用CSS selectors 来匹配确切的类名。

    html = '''<li> no wanted </li>
    <li class="a"> not his one </li>
    <li class="a z"> neither this one </li>
    <li class="b z"> neither this one </li>
    <li class="c z"> neither this one </li>
    <li class="z"> I WANT THIS ONLY ONE</li>'''
    
    soup = BeautifulSoup(html, 'lxml')
    
    tags = soup.select('li[class="z"]')
    print(tags)
    

    使用lambda可以达到同样的效果:

    tags = soup.find_all(lambda tag: tag.name == 'li' and tag.get('class') == ['z'])
    

    输出:

    [<li class="z"> I WANT THIS ONLY ONE</li>]
    

    看看Multi-valued attributes。你会明白为什么class_='z' 匹配所有类名中包含z 的标签。

    HTML 4 定义了一些可以有多个值的属性。 HTML 5 删除了其中一些,但定义了更多。最常见的多值属性是class(即一个标签可以有多个 CSS 类)。其他包括relrevaccept-charsetheadersaccesskey。 Beautiful Soup 将多值属性的值呈现为列表:

    css_soup = BeautifulSoup('<p class="body"></p>')
    css_soup.p['class']
    # ["body"]
    
    css_soup = BeautifulSoup('<p class="body strikeout"></p>')
    css_soup.p['class']
    # ["body", "strikeout"]
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      data = soup.find_all('li',{'class':'z'})
      print(data)
      

      如果你只想获取文本:

      for a in data:
         print(a.text)
      

      【讨论】:

        【解决方案3】:

        可能带有过滤功能,如doc

        def is_only_z(css_class):
            return css_class is not None and css_class == 'z'
        
        bs4.find_all('li',class_=is_only_z)
        

        【讨论】:

          猜你喜欢
          • 2019-07-15
          • 1970-01-01
          • 1970-01-01
          • 2015-09-05
          • 2019-03-17
          • 2011-12-05
          • 2013-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多