如何使用Selenium从网页获取所有元素?

时间:2017-12-21 18:55:40

标签: python html selenium tags webpage

我的Python代码只找到HTML的第一篇文章,因此它打印的是同一个链接。如何从HTML获取所有文章标签?感谢。

Python代码:

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>

2 个答案:

答案 0 :(得分:2)

要做到这一点,你需要Selenium进行一次名为Task.WaitAll()的特殊操作。你可以像这样在顶部导入它:

from selenium.webdriver.common.action_chains import ActionChains

然后按以下步骤进行:

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

对于每个文章web元素,您可以从driver调用相同的方法来查看该元素。 XPath的双斜杠(//)规定它搜索整个DOM而不考虑任何特定元素(这就是为什么它每次都找到相同的元素),所以你需要搜索它&直接的孩子(即/)。

编辑:默认情况下,带有售罄文本的元素的CSS属性为display: none;。触发售罄文本的唯一方法是将鼠标悬停在每个元素上。幸运的是,Selenium也有这种能力。我也改变了我的原始代码,没有售罄的商品没有带有&#34;售罄标签的div&#34;类,这样会导致错误。

答案 1 :(得分:0)

如果您要使用文本HTML打印href个节点,则根据您共享的sold out,您可以使用以下代码块:

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