【问题标题】:How can I find an element looping through a list of divs using Selenium?如何使用 Selenium 找到循环遍历 div 列表的元素?
【发布时间】:2020-05-09 16:19:58
【问题描述】:

在一个结构如下的 HTML 文件中:

<div class="card">
    <div class="id">
        ID: 123456
    </div>
    <div class="title">
        Title 1
    </div>
    <div class="description">
        Description 1
    </div>
</div>

<div class="card">
    <div class="id">
        ID: 89123
    </div>
    <div class="title">
        Title 2
    </div>
</div>

假设我有一个可变数量的带有“卡片”类的 div,使用 Selenium 我想遍历这些 div,如果有带有类描述的 div,我想打印他的文本。 我试图做类似下面的代码,但使用find_element_by_xpath。我总是会得到第一个具有“描述”类的元素。如何通过循环遍历 div 来解决此问题并正确获取元素?非常感谢。

cards = webdriver.find_elements_by_xpath("//div[@class='main-div']")

for card in cards:
    try:
        description = card.find_element_by_xpath("//div[@class='description']")
        print(description.text)
    except:
        print("No description")

【问题讨论】:

    标签: python html selenium selenium-webdriver web-scraping


    【解决方案1】:

    您需要获取所有具有“卡片”类的 div 并在其中搜索 div“描述”:

    cards = webdriver.find_elements_by_css_selector(".card")
    
    for card in cards:
    
        try:
    
            description = card.find_element_by_css_selector(".description")
            print(description.text)
    
        except:
    
            print("No description.")
    

    PS:或者将您的第一个 XPath 更改为 //div[@class='card'],将第二个 XPath 更改为 .//div[@class='description'],就像其他答案中建议的人一样。

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      只需将. 用于intermediate 子标签。所以应该是这样的

      card.find_element_by_xpath(".//div[@class='description']")
      

      代码在这里:

      cards = webdriver.find_elements_by_xpath("//div[@class='card']")
      
      for card in cards:
          try:
              description = card.find_element_by_xpath(".//div[@class='description']")
              print(description.text)
          except:
              print("No description")
      

      【讨论】:

        【解决方案3】:

        您可以使用一个定位器和一个循环来做到这一点。

        for description in driver.find_elements_by_css_selector("div.card > div.description"):
            print(description.text)
        

        注意:如果您想修复当前代码,您只是缺少第二个 XPath 中的 self . 轴。将"//div[@class='description']" 更改为".//div[@class='description']",表示您要从当前的card 元素开始搜索。

        有关self 轴的更多信息,请参阅mdn,其中包含很多很棒的 XPath 和 CSS 选择器相关信息。

        【讨论】:

          猜你喜欢
          • 2018-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-11
          • 1970-01-01
          相关资源
          最近更新 更多