使用Selenium抓取Yahoo财经涨幅榜表格中name与change文本时遭遇‘value must be a string’错误的技术求助
解决Selenium提取Yahoo Finance表格数据时的"value must be a string"错误
你遇到的value must be a string错误,核心是代码里的元素定位和遍历逻辑出了问题,我帮你梳理下问题点并给出修正方案:
问题根源拆解
- xpath参数类型错误:你把
tr元素对象传给了find_element_by_xpath(),但这个方法要求传入字符串格式的xpath表达式,不是元素对象,这直接触发了报错。 - 元素定位范围错误:用
driver.find_element_by_tag_name('tr')会从整个页面找第一个tr(大概率是表头行),而你需要的是tbody下的数据行。 - 遍历逻辑错误:
row.find_element_by_tag_name('td').text只会拿到该行第一个td的文本,再遍历这个字符串的每个字符,完全偏离了你提取整列文本的需求。
修正后的完整代码
# 定位目标表格的tbody区域 table_location = """//*[@id="scr-res-table"]/div[1]/table/tbody""" table = driver.find_element_by_xpath(table_location) # 获取tbody下的所有数据行(用复数方法find_elements拿到所有tr) rows = table.find_elements_by_tag_name('tr') for row in rows: # 获取当前行的所有td元素 tds = row.find_elements_by_tag_name('td') # 确保行内有足够的td列,避免索引越界 if len(tds) >= 4: # 提取name(第2个td,索引1)和change(第4个td,索引3)的文本 name = tds[1].text change = tds[3].text print(f"Name: {name}, Change: {change}")
关键修正说明
- 缩小定位范围:从目标tbody下获取所有tr行,避免拿到表头或者页面其他无关的tr元素。
- 使用复数定位方法:
find_elements_by_tag_name会返回所有匹配的元素列表,方便遍历每一行。 - 精准提取目标列:通过索引直接定位到name和change对应的td,符合你的需求。
- 增加异常防护:判断td的数量,防止页面结构变动导致的索引越界错误。
内容的提问来源于stack exchange,提问作者MK jump
相关产品推荐
相关产品推荐

