+-
如何使用Selenium找到一个在div列表中循环的元素? 第一篇

在一个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>

假设我有一个数量不等的divs,类为 "卡",使用Selenium,我想在这些divs中循环,如果有div的类描述,我想打印他的文本。我试着做了一些类似下面的代码,但是使用了 find_element_by_xpath. 我总是会得到第一个有 "description "类的元素。我怎样才能解决这个问题,并通过循环浏览divs来正确获取元素?非常感谢。

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")
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'] 作为提议的家伙从另一个答案。

我希望它能帮助你

1
投票

只要使用 . 对于 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")
1
投票

你可以用一个定位器和一个循环来做这个。

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

注意:如果你想修复你当前的代码,你只是缺少了自带的 . 第二条XPath中的轴。改变 "//div[@class='description']"".//div[@class='description']" 表示您要从当前的 card 元素。

更多关于 self 轴,见 mdn 其中有很多与XPath和CSS选择器相关的信息。