如何用Selenium WebDriver获取指定属性的div并解决迭代报错问题
网页爬取问题:无法遍历符合指定属性的元素
需求与问题
我是网页爬取新手,想要爬取某网站中所有带有data-feature-id=homepage/story属性的元素,最终目标是提取每个该元素下的子元素。但我无法获取所有符合该属性的元素,尝试定位外层div时仅返回一个元素。
编写的代码
def getLinks(self): container = self.driver.find_element(By.XPATH, '//*[@id="__next"]/div[3]/div/main/article/div') for item in container: headline = container.find_element(By.XPATH, '//*[@id="__next"]/div[3]/div/main/article/div/div[1]/div/div[1]/a/h3') print(headline)
运行报错
TypeError:'WebElement' object is not iterable
解决方法
问题根源
find_element仅返回第一个匹配的单个WebElement对象,不是可遍历的列表,直接用for循环会触发类型错误。- 采用绝对XPATH定位子元素,每次都会从根节点查找,无法匹配每个子项的对应内容。
- 未直接利用目标元素的
data-feature-id属性定位,依赖不稳定的外层div路径。
修正后的代码(XPATH版本)
def getLinks(self): # 用find_elements(复数)获取所有符合属性的元素列表 story_items = self.driver.find_elements(By.XPATH, '//*[@data-feature-id="homepage/story"]') for item in story_items: # 以当前item为根,相对定位子元素(XPATH开头加.) headline = item.find_element(By.XPATH, './/div[1]/div/div[1]/a/h3') # 提取并打印标题文本 print(headline.text)
修正后的代码(CSS选择器版本,更简洁)
def getLinks(self): # CSS选择器定位带指定属性的元素 story_items = self.driver.find_elements(By.CSS_SELECTOR, '[data-feature-id="homepage/story"]') for item in story_items: # 相对定位子元素 headline = item.find_element(By.CSS_SELECTOR, 'div:nth-child(1) div div:nth-child(1) a h3') print(headline.text)
关键注意点
- 必须用
find_elements(复数形式)才能获取所有匹配元素的可遍历列表。 - 子元素定位时,XPATH开头的
.表示仅在当前元素范围内查找,避免重复定位到第一个元素。 - 直接通过
data-feature-id属性定位目标元素,比依赖外层div的绝对路径更稳定,网站结构微调时不易失效。
内容的提问来源于stack exchange,提问作者LoganN
相关产品推荐
相关产品推荐

