2017-05-28 2 views
1

Mein erstes hier auf SO. Danke, dass du uns so lange geholfen hast. Kommen gerade zu Punkt:beautifulsoup CSS Select - finde ein Tag, in dem ein bestimmtes Attribut (Stil für ex) nicht vorhanden ist

Szenario: ich auf einem bestehenden Programm arbeite, die den CSS-Selektor als String aus einer Konfigurationsdatei liest das Programm dynamisch und in der Lage zu machen, jede Website verschrotten nur durch eine Änderung der Konfiguration Wert des CSS-Selektors.

Problem: Ich versuche, eine Website zu kratzen, welche Elemente als eine der zwei Optionen unten rendert:

Option1:

......... 
<div class="price"> 
    <span class="price" style="color:red;margin-right:0.1in"> 
    <del>$299</del> 
    </span> 
    <span class="price"> 
    $195 
    </span> 
</div> 

soup = soup.select("span.price") - this doesn't work as I need second span tag or last span tag :(

Option2:

......... 
<div class="price"> 
    <span class="price"> 
    $199 
    </span> 
</div> 

soup = soup.select("span.price") - this works great! 

Frage: In den beiden oben genannten Op Ich möchte in der Lage sein, das letzte Span-Tag ($ 195 oder $ 199) zu bekommen und kümmern sich nicht um die $ 299. Im Grunde möchte ich nur den endgültigen Verkaufspreis und nicht den ursprünglichen Preis extrahieren.

So sind die zwei Möglichkeiten, wie ich schon jetzt wissen, sind:

1) erhalten Sie immer die letzte Span-Tag 2) immer die span-Tag bekommen, die nicht style-Attribut

Nun hat, ich weiß, die nicht bediener, last-of-type sind nicht vorhanden in bs4 (nur nth-of-type ist verfügbar) so bin ich hier fest. Irgendwelche Vorschläge sind hilfreich.

Bearbeiten: - Da dies ein bestehendes Programm ist, kann ich supp.find_all() oder eine andere Methode außer supp.select() verwenden. Leider :(

Dank

+0

Ich verstehe nicht, was Sie genau tun müssen, aber Sie können keine Anzeige für del {{{umspannen del {display verwenden: none;) –

+0

In diesem Buch steht "last-of-type": https://books.google.nl/books?id=mEu7DQAAQBAJ&pg=PA6&lpg=PA6&dq=bootstrap+4+last-of-type&source=bl&ots=zUmAMxCMG-&sig=kCjR8TivvajvtMlf -gOE5lABA2w & hl = de & sa = X & ve = 0ahUKEwjUuMrdlJLUAHWOY1AKHQT1AvIQ6AEIVTAH # v = Seite & q = Bootstrap% 204% 20Last-of-Type & f = falsch – Gerard

+0

Können Sie URL teilen? Ansonsten versuche supp.select ("span.Preis ", {'style': None}) – Gahan

Antwort

1

Sie können ohne Stil-Attribut für den span-Tag suchen:.

prices = soup.select('span.price') 
no_style = [price for price in prices if 'style' not in price.attrs] 
>> [<span class="price">$199</span>] 
+0

Dank Gil. Allerdings arbeite ich an einem bestehenden Programm, das nur supp.Select-Methode aufgerufen wird daher nicht auf diese Weise ohne Überholung des vollständigen Programms –

+0

OK Ich habe den Code bearbeitet, um die supp.select-Methode zu verwenden. Es sollte immer noch funktionieren. Hilft das? –

+0

Nochmals vielen Dank Gil. Ich hätte erwähnen sollen, dass ich nur den Luxus habe, eine Zeichenfolge zu verwenden welches in der soup.select() Methode übergeben werden soll. Wenn ich irgendeinen zusätzlichen Code zu diesem Programm hinzufügen würde, dann müsste ich die kompletten Testreihen durchlaufen und ich könnte dieses Programm dann auch auf generischer Basis flexibler machen. –

0

Dies könnte eine gute Zeit sein, eine Funktion zu verwenden In diesem Fall BeautifulSoup gibt span_with_style jeden Tag und die Funktion prüft, ob name ist der Tag span und es hat das Attribut style. Wenn dies wahr ist, dann BeautifulSoup hängt den Tag auf seine Liste der Ergebnisse.

HTML = '''\ 
<div class='price'> 
    <span class='price' style='color: red; margin-right: 0.1in'> 
     <del>$299</del> 
    </span> 
    <span class='price'> 
     $195 
    </span> 
</div>''' 
from bs4 import BeautifulSoup 
soup = BeautifulSoup(HTML, 'lxml') 

for item in soup.find_all(lambda tag: tag.name=='span' and tag.has_attr('style')): 
    print (item) 
+0

Danke Bill. Das ist eine saubere Lösung, aber da ich ein bestehendes Programm ändere, das nur supp.select aufruft (), kann ich die Funktion nicht aufrufen, ohne das gesamte Programm zu überarbeiten :( –

+0

Jetzt gucken. - –

0

Der Code innerhalb der select-Funktion muss sich ändern:

def select(soup, the_variable_you_pass): 
    soup.find('div', attrs={'class': 'price'}).find_all(the_variable_you_pass)[-1] 
Verwandte Themen