代码之家  ›  专栏  ›  技术社区  ›  Tae

Python3中方法has\u key的替换

  •  2
  • Tae  · 技术社区  · 6 年前

    我想改变这个

    def has_class_but_no_id(tag):
        return tag.has_key('class') and not tag.has_key('id')
    

    此函数来自Python2,不适用于Python3

    我早就想到了

    我在如下列表中更改了此HTML文档

    list_of_descendants = list(soup.descendants)
    

    所以我可以得到包含类但不包含id的标记 它是关于查找所有标签的 class = blabla... 但不是 id = .... 我不知道如何处理这个问题

    2 回复  |  直到 6 年前
        1
  •  0
  •   Keyur Potdar    6 年前

    这个 documentation 表示:

    为了与Python 3兼容,我重命名了一个方法:

    • Tag.has_key() -&燃气轮机; Tag.has_attr()

    此外,在 documentation here :

    如果其他匹配项都不适用于您,请定义一个函数 将元素作为其唯一参数。函数应返回 True 如果参数匹配,并且 False 否则

    下面是一个返回 符合事实的 如果标记定义了类 属性,但未定义–id–属性:

    def has_class_but_no_id(tag):
        return tag.has_attr('class') and not tag.has_attr('id')
    
        2
  •  -1
  •   Ali    6 年前

    嘿,我解决了这个问题。

    我要做的是

    1.收集所有标签(BeautifulSoup)和标签的所有子项(contents)

    soup = BeautifulSoup(html_doc,"html.parser")
    list_of_descendants = list(soup.descendants)
    

    2.消除所有Navigablestring(因为它们不能接受has\u attr()方法)

    def terminate_navis(list_of_some):
    
        new_list = []
    
        for elem in list_of_some:
    
            if type(elem) == bs4.element.Tag:
                new_list.append(elem)
            else :
                continue
    
        return new_list 
    
    
    new_list = terminate_navis(list_of_descendants)
    
    
    def contents_adding(arg_list):
    //this Method helps that get all the childrens of tags in lists again
    
        new_list = arg_list
    
        child_list = []
    
        for elem in arg_list:
    
            if elem.contents:
    
                child_list = elem.contents
                child_list = terminate_navis(child_list)
                new_list.extend(child_list)
    
            new_list = list(set(new_list))
    
        return new_list
    

    3.如果标签具有属性“class”(has\u attr),并且没有“id”(也具有has\u attr),则过滤所有标签

    def justcl(tag_lists):
    
        class_lists = []
    
        for elem in tag_lists:
            if elem.has_attr('class'):
                class_lists.append(elem)
            else :
                continue
    
        return class_lists
    
    def notids(class_lists):
    
        no_id_lists = []
    
        for elem in class_lists:
    
            if elem.has_attr('id'):
                continue
            else :
                no_id_lists.append(elem)
    
        return no_id_lists
    
    1. 所有这些收集的标签创建为列表并打印在屏幕上

    打印或使用for循环等。。。