代码之家  ›  专栏  ›  技术社区  ›  Priyank Bolia

我能把两个“findall”搜索块组合成一个吗?

  •  2
  • Priyank Bolia  · 技术社区  · 15 年前

    我能把这两个街区合并成一个街区吗?

    编辑:任何其他方法,而不是结合循环,如雅科比在答案。

    for tag in soup.findAll(['script', 'form']):
        tag.extract()
    
    for tag in soup.findAll(id="footer"):
        tag.extract()
    

    还可以将多个块合并为一个块:

    for tag in soup.findAll(id="footer"):
        tag.extract()
    
    for tag in soup.findAll(id="content"):
        tag.extract()
    
    for tag in soup.findAll(id="links"):
        tag.extract()
    

    或者可能有一些lambda表达式,我可以在其中检查是在数组中还是任何其他更简单的方法中。

    另外,如何找到带有属性类的标记,因为类是保留关键字:

    编辑:此部分由soup.findall(attrs='class':'noprint')解决:

    for tag in soup.findAll(class="noprint"):
        tag.extract()
    
    4 回复  |  直到 7 年前
        1
  •  7
  •   user3850    14 年前

    您可以将函数传递给 .findall() 这样地:

    soup.findAll(lambda tag: tag.name in ['script', 'form'] or tag['id'] == "footer")
    

    但是,您最好先构建一个标签列表,然后对其进行迭代:

    tags = soup.findAll(['script', 'form'])
    tags.extend(soup.findAll(id="footer"))
    
    for tag in tags:
        tag.extract()
    

    如果你想过滤几个 id 你可以使用:

    for tag in soup.findAll(lambda tag: tag.has_key('id') and
                                        tag['id'] in ['footer', 'content', 'links']):
        tag.extract()
    

    更具体的方法是将lambda分配给 身份证件 参数:

    for tag in soup.findAll(id=lambda value: value in ['footer', 'content', 'links']):
        tag.extract()
    
        2
  •  4
  •   Yacoby    15 年前

    我不知道漂亮的汤是否能做得更优雅,但你可以像这样合并两个循环:

    for tag in soup.findAll(['script', 'form']) + soup.findAll(id="footer"):
        tag.extract()
    

    你可以找到这样的课程( Documentation ):

    for tag in soup.findAll(attrs={'class': 'noprint'}):
        tag.extract()
    
        3
  •  0
  •   user3850    15 年前

    你问题第二部分的答案是 就在那里 documentation :

    按CSS类搜索

    如果不是因为一件事,attrs参数将是一个非常模糊的特性:css。搜索具有特定css类的标记非常有用,但是css属性class的名称也是一个python保留字。

    您可以使用soup.find(“tagname”,“class”:“css class”)按css类搜索,但对于这种常见的操作来说,这是很多代码。相反,您可以为attrs传递字符串,而不是字典。该字符串将用于限制CSS类。

    from BeautifulSoup import BeautifulSoup
    soup = BeautifulSoup("""Bob's <b>Bold</b> Barbeque Sauce now available in 
                       <b class="hickory">Hickory</b> and <b class="lime">Lime</a>""")
    
    soup.find("b", { "class" : "lime" })
    # <b class="lime">Lime</b>
    
    soup.find("b", "hickory")
    # <b class="hickory">Hickory</b>
    
        4
  •  0
  •   Suneel Arumalla    7 年前
    links = soup.find_all('a',class_='external') ,we can pass class_ to filter based on class values
    
    from bs4 import BeautifulSoup
    from urllib.request import urlopen
    
    with urlopen('http://www.espncricinfo.com/') as f:
        raw_data= f.read()
        soup= BeautifulSoup(raw_data,'lxml')
        # print(soup)
        links = soup.find_all('a',class_='external')
        for link in links:
            print(link)