首页 文章

如何按类查找元素

提问于
浏览
256

我使用Beautifulsoup解析带有“class”属性的html元素时遇到问题 . 代码看起来像这样

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div["class"]=="stylelistrow"):
        print div

我在脚本完成后“同一行”收到错误 .

File "./beautifulcoding.py", line 130, in getlanguage
  if (div["class"]=="stylelistrow"):
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup.py", line 599, in __getitem__
   return self._getAttrMap()[key]
KeyError: 'class'

我该怎么摆脱或这个错误?

9 回答

  • 35

    您可以优化搜索,只使用BS3查找具有给定类的div:

    mydivs = soup.findAll("div", {"class": "stylelistrow"})
    
  • 168

    一个直接的方式是:

    soup = BeautifulSoup(sdata)
    for each_div in soup.findAll('div',{'class':'stylelist'}):
        print each_div
    

    确保你取出 findAll 的外壳,它不是 findall

  • 1

    更新:2016在最新版本的beautifulsoup中,方法'findAll'已重命名为'find_all' . Link to official documentation

    List of method names changed

    因此,答案将是

    soup.find_all("html_element", class_="your_class_name")
    
  • 3

    尝试先检查div是否具有类属性,如下所示:

    soup = BeautifulSoup(sdata)
    mydivs = soup.findAll('div')
    for div in mydivs:
        if "class" in div:
            if (div["class"]=="stylelistrow"):
                print div
    
  • 3

    这对我有用:

    for div in mydivs:
        try:
            clazz = div["class"]
        except KeyError:
            clazz = ""
        if (clazz == "stylelistrow"):
            print div
    
  • 433

    从文档:

    As of Beautiful Soup 4.1.2, you can search by CSS class using the keyword argument class_:

    soup.find_all("a", class_="sister")
    

    在这种情况下,将是:

    soup.find_all("div", class_="stylelistrow")
    

    它也适用于:

    soup.find_all("div", class_="stylelistrowone stylelistrowtwo")
    
  • 13

    如何按类找到元素我使用Beautifulsoup解析具有“class”属性的html元素时遇到问题 .

    你可以很容易地找到一个 class ,但是如果你想通过两个 class 的交集找到它,那就更难了,

    来自documentation(重点补充):

    如果要搜索与两个或更多CSS类匹配的标记,则应使用CSS选择器:css_soup.select(“p.strikeout.body”)
    #[<p class =“body strikeout”> </ p>]

    需要说明的是,这只选择了三个标记,它们都是三角形和体类 .

    要查找一组类中的任何一个的交集(不是交集,而是联合),您可以给 class_ 关键字参数列表(从4.1.2开始):

    soup = BeautifulSoup(sdata)
    class_list = ["stylelistrow"] # can add any other classes to this list.
    # will find any divs with any names in class_list:
    mydivs = soup.find_all('div', class_=class_list)
    

    另请注意,findAll已从camelCase重命名为更多Pythonic find_all .

  • 6

    具体到BeautifulSoup 3:

    soup.findAll('div',
                 {'class': lambda x: x 
                           and 'stylelistrow' in x.split()
                 }
                )
    

    将找到所有这些:

    <div class="stylelistrow">
    <div class="stylelistrow button">
    <div class="button stylelistrow">
    
  • 14

    这对我来说可以访问class属性(在beautifulsoup 4上,与文档所说的相反) . KeyError返回的列表不是字典 .

    for hit in soup.findAll(name='span'):
        print hit.contents[1]['class']
    

相关问题