【问题标题】:How to get all elements from webpage using Selenium?如何使用 Selenium 从网页中获取所有元素?
【发布时间】:2017-12-21 18:55:39
【问题描述】:

我的 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>

【问题讨论】:

  • 当你说“只找到 html 的第一篇文章”时,你的输出到底是什么?
  • 您能否详细说明运行代码时发生了什么?是什么阻止您从 html 中获取所有文章标签?
  • 问题出在 if 语句中,您在 驱动程序 上调用 find_element 代码。您需要在 i 上调用它并相应地修改您的 XPath
  • 1.无论有多少链接,我的输出都是第一个链接(参见第一个 href)。如果页面上有 50 个链接,它会打印第一个链接 50 次。
  • 2.见#1。我想我得到了所有的元素,我认为 for 循环内的执行是错误的。

标签: python html selenium tags webpage


【解决方案1】:

为此,您需要 Selenium 的一项特殊操作,称为 Action Chains。您可以像这样在顶部导入它:

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 也有这种能力。我也稍微更改了我的原始代码,未售罄的商品没有带有“已售罄标签”类的 div,因此会导致错误。

【讨论】:

  • 这实际上只是得到了相同的结果,我不知道为什么
  • 嗯。把你要提取的页面的链接发过来,我看看是不是在我这边
  • supremenewyork.com/shop/all 感谢您的帮助
  • 没问题!很高兴我能帮上忙
【解决方案2】:

根据您共享的HTML,如果您想打印带有文本sold out 的节点的hrefs,您可以使用以下代码块:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2018-11-09
    • 2011-12-18
    相关资源
    最近更新 更多