2016-10-01 4 views
0

Ich habe die unten htmlMit BeautifulSoup mit mehreren Tags mit dem gleichen Namen

<g class="1581 sqw_sv5" style="cursor: pointer;"> 
<path d="M397.696,126.554C397.696,126.554,404.57504,140.2417375,404.57504,140.2417375" stroke="#ffffff" style="stroke-width: 3.6; stroke-opacity: 0.5; stroke-linecap: round; fill-opacity: 0;"> 
</path> 
<path d="M397.696,126.554C397.696,126.554,404.57504,140.2417375,404.57504,140.2417375" stroke="#f95a0b" style="stroke-width: 1.2; stroke-linecap: round; fill-opacity: 0;"> 
</path> 

Ich brauche den Wert des ‚Hub‘ in dem zweiten Pfad zu erhalten. Mein aktueller Code zieht nur den Wert aus dem ersten Pfad.

Ich bin derzeit mit

shots = soup.find_all('g') 
for shot in shots: 
    print(shot.path['stroke']) 

die #ffffff zurückgibt. Ich brauche es # f95a0b

+0

Ist es immer der zweite Weg? –

Antwort

1

Hier ist meine Lösung für Ihre Frage. Mein Problem mit meiner Antwort ist, dass es möglicherweise zu spezifisch ist. Dies funktioniert nur, wenn der Wert style immer "stroke-width: 1.2; stroke-linecap: round; fill-opacity: 0;" ist und wenn nur ein solches path Element im gesamten Dokument vorhanden ist.

Die Idee hinter dieser Lösung besteht darin, die Elemente schnell einzugrenzen, indem nach dem Element gesucht wird, das für das gewünschte Element mit dem gewünschten Attribut einzigartig ist.

` 
from bs4 import BeautifulSoup 

html = """"<g class="1581 sqw_sv5" style="cursor: pointer;"> 
<path d="M397.696,126.554C397.696,126.554,404.57504,140.2417375,404.57504,140.2417375" stroke="#ffffff" style="stroke-width: 3.6; stroke-opacity: 0.5; stroke-linecap: round; fill-opacity: 0;"> 
</path> 
<path d="M397.696,126.554C397.696,126.554,404.57504,140.2417375,404.57504,140.2417375" stroke="#f95a0b" style="stroke-width: 1.2; stroke-linecap: round; fill-opacity: 0;"> 
</path>""" 

soup = BeautifulSoup(html, "html.parser") 
# get the desired 'path' element using the 'style' that identifies it 
desired_element = soup.find("path", {"style" : "stroke-width: 1.2; stroke-linecap: round; fill-opacity: 0;"}) 
# get the attribute value from the extracted element 
desired_attribute = desired_element["stroke"] 
print (desired_attribute) 
# prints #f95a0b 
` 

Wenn dieser Ansatz ein no go ist, dann können Sie BeautifulSoups die next_sibling oder findNext Methoden verwenden. Suchen Sie im Prinzip nach dem ersten Pfadelement, das Sie gerade mit Ihrem Code bewerkstelligen, und springen Sie von dort zum nächsten Pfadelement, das enthält, was Sie brauchen.

findnext: Beautifulsoup - nextSibling

next_sibling: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#next-sibling-and-previous-sibling

+0

Danke. Ich konnte deinen ersten Vorschlag nicht verwenden, aber next_sibling hat perfekt funktioniert. – bgrantham

+0

Gern geschehen. Froh, dass es für dich funktioniert hat. –

2

zurückkehren Sie müssen find_all verwenden, um zuerst die ganze Weg des und extrahieren zu finden, zuletzt:

h = """<g class="1581 sqw_sv5" style="cursor: pointer;"> 
<path d="M397.696,126.554C397.696,126.554,404.57504,140.2417375,404.57504,140.2417375" stroke="#ffffff" style="stroke-width: 3.6; stroke-opacity: 0.5; stroke-linecap: round; fill-opacity: 0;"> 
</path> 
<path d="M397.696,126.554C397.696,126.554,404.57504,140.2417375,404.57504,140.2417375" stroke="#f95a0b" style="stroke-width: 1.2; stroke-linecap: round; fill-opacity: 0;"> 
</path>""" 
soup = BeautifulSoup(h) 
shots = soup.find_all('g') 
for shot in shots: 
    print(shot.find_all("path", stroke=True)[-1]["stroke"] 

Mit shot.path['stroke'] entspricht shot.find("path")['stroke'] zu verwenden, die nur zurückkehren würde die erster Weg.

Oder mit n-of-Typ kann auch auf die Struktur des HTML-abhängig arbeiten:

soup = BeautifulSoup(h) 
shots = soup.find_all('g') 
for shot in shots: 
    print(shot.select_one("path:nth-of-type(2)")["stroke"]) 
Verwandte Themen