结合BeautifulSoup与Selenium爬取页面提取onclick内master_key值
批量提取a标签中master_key的实现方案
你现有代码只实现了单个a标签的抓取,没有做属性值解析,按以下修改即可批量拿到所有目标master_key:
- 提前导入正则模块
re,预编译匹配规则:master_key后跟随的是36位带横杠的UUID格式值,用正则r'master_key=([A-F0-9-]{36})'可以精准匹配,不会和其他参数混淆 - 把单元素查找的
find()替换为find_all(),同时增加onclick属性过滤,只筛选带master_key的目标a标签,减少无效遍历 - 点击搜索按钮后增加显式等待,等页面列表加载完成再解析源码,避免异步加载导致抓不全数据
- 遍历所有匹配到的a标签,从onclick属性值中提取正则命中的master_key即可
修改后的完整可运行代码:
from bs4 import BeautifulSoup as bs from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.firefox.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import re # 预编译正则匹配规则,提升遍历效率 MASTER_KEY_PATTERN = re.compile(r'master_key=([A-F0-9-]{36})', re.I) options = Options() options.headless = False driver = webdriver.Firefox(options=options) driver.get("https://annual.asaecenter.org/expo.cfm?") driver.find_element(By.XPATH, "//*[@id='clickAgreeCookie']").click() driver.find_element(By.XPATH, "//*[@id='search_table']/tbody/tr[7]/td[2]/input[2]").click() # 等待参展商列表加载完成,避免源码抓取不全 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a[href="javascript:void(0)"][onclick*="master_key"]'))) page = bs(driver.page_source, 'html.parser') # 批量查找所有符合特征的a标签 a_tags = page.find_all("a", href="javascript:void(0)", onclick=re.compile(r"master_key=")) master_keys = [] for tag in a_tags: onclick_content = tag.get('onclick', '') match_result = MASTER_KEY_PATTERN.search(onclick_content) if match_result: master_keys.append(match_result.group(1)) # 逐行打印所有提取到的master_key for key in master_keys: print(key) driver.quit()
运行后输出的每个值就是和示例格式一致的纯master_key值,会自动覆盖页面中所有可提取的目标key。
内容的提问来源于stack exchange,提问作者BQuist
相关产品推荐
相关产品推荐

