如何提取BSCscan合约页面0x格式十六进制字符串及其对应属性标签
问题原因
- CSS选择器使用错误:
readContractAccordion是元素ID,调用select_one时需要添加#前缀才能正确匹配 - 缺少请求头伪装:BSCscan会拦截无合法User-Agent的请求,返回的内容不包含完整的读合约模块数据
- 缺少元素解析逻辑:定位到父容器后,还需要遍历每个合约读取项,提取对应序号、属性名和十六进制地址
修正后可用代码
import re import requests from bs4 import BeautifulSoup as bs # 伪装浏览器请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } url = "https://bscscan.com/readContract?m=normal&a=0xe1fd7b4c9debac3c490d8a553c455da4979482e4" address = url.split("a=")[-1] # 匹配标准42位0x开头地址的正则规则 addr_pattern = re.compile(r"0x[a-fA-F0-9]{40}") r = requests.get(url, headers=headers) soup = bs(r.text, "lxml") # 正确定位读合约父容器 parent = soup.select_one("#readContractAccordion") # 获取所有合约读取项节点 card_items = parent.select(".card") print(f"Address: {address}") for item in card_items: # 提取项序号 num = item.select_one(".font-weight-medium").text.strip().removesuffix(".") # 提取属性名 func_name = item.select_one(".text-monospace").text.strip() # 提取内容中的地址 content = item.select_one(".card-body").text addr_match = addr_pattern.search(content) if addr_match: # 格式化对齐输出 print(f"{num:>3}. {func_name:<25}: {addr_match.group()}")
运行输出效果
Address: 0xe1fd7b4c9debac3c490d8a553c455da4979482e4 1. DOGE : 0xba2ae424d960c26247dd6c32edc70b295c744c43 4. _marketingWalletAddress : 0x12345411294d0fddf644800e3a524cb73ffdfe7f 8. deadWallet : 0x000000000000000000000000000000000000dead 11. dividenTracker : 0x7cf7ea291e26bc3d8796c876f1d63befbdc5f22c 23. owner : 0xab3a68876925ecc5f361cefe78b3dae78b971436 28. uniswapV2Pair : 0xd6a499cbe432bfe88c62a27d7e1437ddafe3a95a 29. uniswapV2Router : 0x10ed43c718714eb63d5aa57b78b54704e256024e
内容的提问来源于stack exchange,提问作者rbutrnz
相关产品推荐
相关产品推荐

