Frage

Kann ich kombinieren diese beiden Blöcke in einem:

Edit:. Jedes andere Verfahren als Schleifen wie Yacoby Kombination hat in der Antwort

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

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

Auch kann ich mehrere Blöcke in einem:

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

oder kann es einig Lambda-Ausdruck, wo ich, ob in Array überprüfen kann, oder jede andere einfachere Methode.

Auch wie finde ich Tags mit Attributklasse, als Klasse Schlüsselwort ist reserviert:

EDIT: dieser Teil durch die soup.findAll gelöst (attrs = { 'Klasse': 'noprint'}):

for tag in soup.findAll(class="noprint"):
    tag.extract()
War es hilfreich?

Lösung

Sie können Funktionen übergeben, so .findall():

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

Aber Sie könnten besser sein, indem zuerst eine Liste von Tags zu bauen und dann über sie iterieren:

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

for tag in tags:
    tag.extract()

Wenn Sie mehrere ids filtern möchten, können Sie:

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

Ein speziellere Ansatz wäre, einen Lambda zum id Parameter zuweisen:

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

Andere Tipps

Ich weiß nicht, ob es BeautifulSoup elegant mehr tun können, aber man konnte die zwei Schleifen wie so zusammen:

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

Sie können Klassen finden wie so ( Dokumentation ):

for tag in soup.findAll(attrs={'class': 'noprint'}):
    tag.extract()

Die Antwort auf den zweiten Teil Ihrer Frage ist genau dort in Dokumentation :

  

Suche nach CSS-Klasse

     

Das attrs Argument sei ein ziemlich obskures Feature war es nicht für eine Sache: CSS. Es ist sehr nützlich für einen Tag zu suchen, die eine bestimmte CSS-Klasse, aber der Name des CSS-Attribut, Klasse, ist auch ein Python reserviertes Wort.

     

Sie können von CSS-Klasse mit soup.find suchen ( „tagName“, { „Klasse“: „CssClass“}), aber das ist eine Menge Code für einen solchen gemeinsamen Betrieb. Stattdessen können Sie eine Zeichenfolge für attrs anstelle eines Wörterbuchs übergeben. Die Zeichenfolge wird verwendet, um die CSS-Klasse zu beschränken.

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>
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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top