为什么使用Selenium无法提取ul、li元素中的文本内容?
问题成因
- 核心错误:
find_elements_by_tag_name('li')返回的是li元素的列表对象,列表本身没有text属性,你直接调用l.text自然会触发属性错误,进入except逻辑。你贴出的报错提示'list' object has no attribute 'text'也对应这个问题。 - 定位不精准:你直接用
//ul匹配页面所有ul元素,没有过滤出你需要的「参考文献」「外部链接」区块的ul,会遍历大量无关节点做无效操作。 - 潜在加载问题:没有设置页面元素加载等待,可能出现页面还未渲染完成就开始提取元素的情况,导致拿到空节点列表。
修复方案
建议优先使用Selenium官方推荐的定位写法,同时精准匹配目标区块,修改后可运行代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By PATH = r"C:\Users\Alireza\Desktop\chromedriver\chromedriver.exe" driver = webdriver.Chrome(PATH) # 加隐式等待,最多预留10秒时间让元素加载完成 driver.implicitly_wait(10) driver.get("https://de.wikipedia.org/wiki/Alpha-Beta-Suche") print(driver.title) # 精准定位参考文献、外部链接对应的ul节点,匹配维基百科对应区块的专属类名 target_uls = driver.find_elements(By.XPATH, '//ul[contains(@class,"references") or contains(@class,"external")]') for ul in target_uls: # 拿到当前ul下的所有li列表,遍历逐个提取文本 li_list = ul.find_elements(By.TAG_NAME, 'li') for li in li_list: li_text = li.text.strip() # 跳过无文本的空li if li_text: print("\n" + li_text) driver.quit()
如果你不想修改原有定位逻辑,只需要调整原循环的遍历逻辑即可解决报错:
litwebs = driver.find_elements_by_xpath("//ul") for lit in litwebs: try: l = lit.find_elements_by_tag_name("li") # 遍历li列表,逐个取文本,不要直接对列表调用text属性 for li_item in l: print("\n" + li_item.text) except: print("\n no li")
内容的提问来源于stack exchange,提问作者Juicy Samurai
相关产品推荐
相关产品推荐

