2017-12-21 9 views
0

Mein Python-Code findet nur den ersten Artikel des HTML, also druckt er den gleichen Link. Wie bekomme ich alle Artikel-Tags aus dem HTML? Vielen Dank.Wie bekommt man alle Elemente von der Webseite mit Selen?

Python-Code:

links = driver.find_elements_by_tag_name("article") 
for i in links: 
    if driver.find_element_by_xpath("//div[@class='inner-article']/a//div[@class='sold_out_tag']").get_attribute("innerHTML") == "sold out": 
     print("sold out") 
     link = ((driver.find_element_by_xpath("//div[@class='inner-article']/a").get_attribute("href"))) 
     print(link) 
    else: 
     print("available") 
time.sleep(5) 
driver.quit() 

HTML:

<article> 
    <div class="inner-article"><a style="height:81px;" 
    href="/shop/jackets/jly8dgwqu/w10m2pybx"><img width="81" height="81" 
    src="//d17ol771963kd3.cloudfront.net/139432/vi/AHP1l8fMIcA.jpg" 
    alt="Ahp1l8fmica"><div class="sold_out_tag">sold out</div></a></div> 
</article> 
<article> 
    <div class="inner-article"><a style="height:81px;" 
    href="/shop/jackets/jly8dgwqu/w10m2pybx"><img width="81" height="81" 
    src="//d17ol771963kd3.cloudfront.net/139432/vi/AHP1l8fMIcA.jpg" 
    alt="Ahp1l8fmica"><div class="sold_out_tag">sold out</div></a></div> 
</article> 
+0

Wenn Sie sagen, "nur den ersten Artikel des Befundes html, "Was genau ist deine Ausgabe? – JacobIRR

+0

Können Sie detailliert angeben, was passiert ist, als Sie Ihren Code ausgeführt haben? Und was verhindert, dass Sie alle Artikel Tags aus dem HTML bekommen? –

+0

Das Problem liegt in Ihrer if-Anweisung, die Sie den 'find_element' Code für den * Treiber * aufrufen. Sie müssen es auf "i" aufrufen und Ihren XPath entsprechend ändern. – Mangohero1

Antwort

2

Um dies zu tun, müssen Sie ein spezielles Manöver von Selen Action Chains genannt. Sie können es an der Spitze importieren wie folgt:

from selenium.webdriver.common.action_chains import ActionChains 

Dann gehen Sie wie folgt vor:

articles = driver.find_elements_by_tag_name('article') 
for article in articles: 
    ActionChains(driver).move_to_element(article).perform() 
    if article.find_element_by_tag_name('a').text == "sold out": 
     print("sold out") 
     link = article.find_element_by_xpath('div/a').get_attribute('href') 
     print(link) 
    else: 
     print("available") 

Für jeden Artikel Web-Element, können Sie die gleichen Methoden aus dem driver nennen in diesem Element nur um zu schauen . XPaths doppelter Schrägstrich (//) schreibt vor, dass das gesamte DOM ohne Berücksichtigung eines bestimmten Elements durchsucht wird (weshalb es jedes Mal das gleiche Element findet), so dass Sie nach direkten Kindern suchen müssen (z. B. /).

Bearbeiten: Das Element mit dem ausverkauften Text hat standardmäßig eine CSS-Eigenschaft von display: none;. Die einzige Möglichkeit, den ausverkauften Text auszulösen, besteht darin, die Maus über jedes Element zu bewegen. Glücklicherweise hat Selenium diese Fähigkeit auch. Ich habe auch meinen ursprünglichen Code ein wenig geändert, Artikel, die nicht ausverkauft sind, haben kein div mit einer "ausverkauften" Klasse, das würde zu einem Fehler führen.

+0

Das hat eigentlich nur das gleiche Ergebnis, ich bin mir nicht sicher, warum –

+0

hmm. Senden Sie den Link der Seite, die Sie extrahieren, ich werde sehen, ob es etwas an meinem Ende ist – Mangohero1

+0

http://www.fremenewyork.com/shop/all Danke für die Hilfe –

0

Gemäß der HTML Sie freigegeben haben, wenn Sie die href s der Knoten mit Text sold out drucken möchten, können Sie den folgenden Codeblock verwenden:

links = driver.find_elements_by_tag_name("article") 
for i in links: 
    if "sold out" in i.find_elements_by_xpath("//div[@class='inner-article']/a//div[@class='sold_out_tag']").get_attribute("innerHTML") : 
     print("sold out") 
     print(i.find_element_by_xpath("//div[@class='inner-article']/a").get_attribute("href")) 
Verwandte Themen