![](/img/trans.png)
[英]Python - Selenium : Scraping AngularJS elements with loop over find_elements_by()
[英]How to loop over elements with selenium
我想使用 selenium 循环网页上的几个 div 并找到 div 的内容
网页的基本设置如下所示:
<html>
<div data-testid="property-card">
<div data-testid="title">content 1</div>
</div>
<div data-testid="property-card">
<div data-testid="title">content 2</div>
</div>
<div data-testid="property-card">
<div data-testid="title">content 3</div>
</div>
</html>
这是我的代码:
def report_results(self):
hotel_boxes = self.find_elements(By.XPATH, '//div[@data-testid="property-card"]')
for hotel in hotel_boxes:
hotel_name = hotel.find_element(By.XPATH, '//div[@data-testid="title"]').get_attribute('innerHTML')
print(hotel_name)
但是,问题在于这只会打印“内容1”三遍。 我在这里做错了什么?
你快到了,你唯一缺少的一件事就是一个点.
在 XPath 表达式的前面。
它应该是
hotel_name = hotel.find_element(By.XPATH, './/div[@data-testid="title"]').get_attribute('innerHTML')
当使用'//div[@data-testid="title"]'
XPath 表达式时,它将从页面顶部搜索匹配的定位器,直到找到第一个匹配项。
当我们有那个点时.
这意味着在当前节点内开始搜索,即在父元素hotel
内
因此,您的整个代码可以是:
def report_results(self):
hotel_boxes = self.find_elements(By.XPATH, '//div[@data-testid="property-card"]')
for hotel in hotel_boxes:
hotel_name = hotel.find_element(By.XPATH, './/div[@data-testid="title"]').get_attribute('innerHTML')
print(hotel_name)
根据给定的 HTML:
<html>
<div data-testid="property-card">
<div data-testid="title">content 1</div>
</div>
<div data-testid="property-card">
<div data-testid="title">content 2</div>
</div>
<div data-testid="property-card">
<div data-testid="title">content 3</div>
</div>
</html>
要打印后代<div>
标记的innerText
,您可以使用列表推导,并且可以使用以下任一定位器策略:
使用CSS_SELECTOR和text属性:
print([my_elem.text for my_elem in driver.find_elements(By.CSS_SELECTOR, "div[data-testid='property-card'] > [data-testid='title']")])
使用XPATH和.get_attribute('innerHTML')
:
print([my_elem..get_attribute('innerHTML') for my_elem in driver.find_elements(By.XPATH, "//div[@data-testid='property-card']/div[@data-testid='title']")])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.