如何将Selenium获取的WebElement多行文本文本拆分赋值并解决元素提取异常
解决方案
你之前遇到的AttributeError: 'Webelement' object has no attribute 'split'错误,是因为elem是Selenium返回的WebElement对象,不是字符串,需要先调用它的.text属性拿到文本内容后,再做拆分操作。
1 多行文本批量拆分赋值实现
你打印的elem.text本身是键:值格式的多行文本,直接解析为字典调用更简洁,不需要单独声明大量变量,实现代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def get_lawis_data(): # 等待列表条目可点击后进入详情 WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '/html/body/div/main/div[2]/div[2]/div[1]/table/tbody/tr[1]')) ).click() # 等待信息tab可点击后切换 WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="tab_info"]')) ).click() # 核心:等待信息区块完整加载,避免拿到空内容/不完整内容 accordion_content = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, '//*[@class="accordion-content"]')) ) # 先取文本再按行拆分 line_list = accordion_content.text.strip().split('\n') # 统一解析为字典,自动对应字段 res_dict = {} for line in line_list: if ':' not in line: continue # 只拆分第一个冒号,避免值内容中包含冒号导致解析错误 key_raw, value = line.split(':', 1) # 统一键名格式,替换空格为下划线,方便后续调用 key = key_raw.strip().replace(' ', '_').lower() res_dict[key] = value.strip() return res_dict # 调用后直接按字段名取值即可 data = get_lawis_data() Observation_date = data.get('observation_date') Reporting_date = data.get('reporting_date') Name = data.get('name') # 其余字段直接从res_dict中对应key取值即可
2 稳定提取元素的规范方案
不需要为每个字段单独加等待,用以下方案即可大幅降低加载速度导致的提取失败概率:
- 优先等待父容器加载:只需要先等
accordion-content这个父容器可见,再做内容解析,即可保证子字段都已加载完成,比每个字段单独加等待的代码更简洁,效率也更高 - 替换不稳定的定位方式:尽量避免用
/html/body/...这类绝对路径定位,页面结构稍有调整就会失效,建议优先用By.ID、By.CLASS_NAME或者带固定属性的相对XPath做定位 - 选择匹配场景的等待条件:对于不需要点击的纯展示文本内容,用
visibility_of_element_located(判断元素可见)或者presence_of_element_located(判断元素存在于DOM)等待更合适,不需要用element_to_be_clickable - 增加简单校验逻辑:解析完成后可以判断核心字段(比如观测时间、上报时间)是否为空,如果为空可加入重试逻辑,覆盖偶发的内容加载异常场景
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

