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

Python 如何使用Selenium从网页中获取所有元素?,python,html,selenium,tags,webpage,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("i

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

要做到这一点,您需要一个名为Selenium的特殊操作。您可以在顶部导入它,如下所示:

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元素,您可以从
驱动程序
调用相同的方法来查找该元素。XPath的双斜杠(
/
)指示它搜索整个DOM而不考虑任何特定元素(这就是为什么它每次都定位同一个元素),因此您需要搜索它的直接子元素(即
/


编辑:默认情况下,带有已售完文本的元素的CSS属性为
display:none。触发售罄文本的唯一方法是在每个元素上进行鼠标移动。幸运的是,Selenium也具有这种能力。我还对我的原始代码做了一些修改,没有售完的商品没有一个带有“售完标签”类的div,因此这将导致错误。

要做到这一点,您需要Selenium的一个特殊操作。您可以在顶部导入它,如下所示:

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元素,您可以从
驱动程序
调用相同的方法来查找该元素。XPath的双斜杠(
/
)指示它搜索整个DOM而不考虑任何特定元素(这就是为什么它每次都定位同一个元素),因此您需要搜索它的直接子元素(即
/


编辑:默认情况下,带有已售完文本的元素的CSS属性为
display:none。触发售罄文本的唯一方法是在每个元素上进行鼠标移动。幸运的是,Selenium也具有这种能力。我还稍微更改了我的原始代码,没有售完的项目没有带有“售完标签”类的div,因此这将导致错误。

根据您共享的
HTML
如果您想打印带有文本
售完的
href
节点的
href
可以使用以下代码块:

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

根据您共享的
HTML
,如果要打印文本
售罄的节点
href
s,可以使用以下代码块:

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

当您说“仅查找html的第一篇文章”时,您的输出是什么?您能否详细说明在运行代码时发生了什么?是什么阻止您从html获取所有文章标记?问题在于您调用驱动程序上的
find\u元素的if语句中。您需要在
i
上调用它,并相应地修改XPath 1。无论有多少链接,我的输出都是第一个链接(请参阅第一个href)。如果页面上有50个链接,它会将第一个链接打印50次。见#1。我认为我得到了所有的元素,我认为for循环中的执行是错误的。当你说“仅查找html的第一篇文章”时,你的输出是什么?你能详细说明运行代码时发生了什么吗?是什么阻止您从html获取所有文章标记?问题在于您调用驱动程序上的
find\u元素的if语句中。您需要在
i
上调用它,并相应地修改XPath 1。无论有多少链接,我的输出都是第一个链接(请参阅第一个href)。如果页面上有50个链接,它会将第一个链接打印50次。见#1。我认为我得到了所有的元素,我认为for循环中的执行是错误的。这实际上得到了相同的结果,我不知道为什么。发送你正在提取的页面的链接,我来看看是否是我这边的内容谢谢你的帮助没问题!很高兴我能帮上忙,结果也一样,我不知道为什么。发送你正在提取的页面的链接,我来看看是否是我这边的内容谢谢你的帮助没问题!很高兴我能帮忙