Python – combine two ‘findAll’ search blocks in beautifulsoup, into one

beautifulsouppython

Can I combine these two blocks into one:

Edit: Any other method than combining loops like Yacoby did in the answer.

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

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

Also can I multiple blocks into one:

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()

or may be there is some lambda expression where I can check whether in array, or any other simpler method.

Also how do I find tags with attribute class, as class is reserved keyword:

EDIT: this part is solved by the soup.findAll(attrs={'class': 'noprint'}):

for tag in soup.findAll(class="noprint"):
    tag.extract()

Best Solution

You can pass functions to .findall() like this:

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

But you might be better off by first building a list of tags and then iterating over it:

tags = soup.findAll(['script', 'form'])
tags.extend(soup.findAll(id="footer"))

for tag in tags:
    tag.extract()

If you want to filter for several ids, you can use:

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

A more specific approach would be to assign a lambda to the id parameter:

for tag in soup.findAll(id=lambda value: value in ['footer', 'content', 'links']):
    tag.extract()
Related Question