Python实现URL页面字符串匹配返回整行,解决重复输出问题
问题原因
你现有代码的问题主要来自三个方面:
- 重复输出:同一个内容行可能同时匹配多个查询关键词,每匹配到一个关键词就触发一次打印,导致同一行重复输出
- 结果遗漏:一是未加请求头触发bscscan反爬机制,部分请求返回内容不完整,二是用
*分割内容的逻辑仅适配部分合约格式,其他格式的合约注释内容会被错误拆分导致匹配不到 - 无关内容输出:关键词
https://www.会命中大量非目标的代码行,导致输出冗余
修正后代码
from bs4 import BeautifulSoup as bs import requests addrlist = ['0xe56842ed550ff2794f010738554db45e60730371', '0xe1fd7b4c9debac3c490d8a553c455da4979482e4', '0x88c20beda907dbc60c56b71b102a133c1b29b053'] queries = ["Website", "Telegram", "Twitter"] baseurl = "https://bscscan.com/address/" # 加请求头避免反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } for addr in addrlist: url = baseurl + addr r = requests.get(url, headers=headers) soup = bs(r.text, 'lxml') pre = soup.select_one('pre.js-sourcecopyarea.editor') if not pre: continue # 改用换行分割内容,适配所有合约格式 content_lines = pre.text.split('\n') # 去重集合避免同一地址重复输出 printed = set() for line in content_lines: strip_line = line.strip() if not strip_line or strip_line in printed: continue # 匹配到任意关键词就打印并跳出循环,避免重复触发打印 for q in queries: if q in strip_line: print(strip_line) printed.add(strip_line) break # 每个地址输出完加空行分隔,符合预期格式 print()
修改说明
- 新增请求头模拟浏览器访问,解决bscscan反爬导致的内容缺失问题,第二个地址的匹配结果可以正常返回
- 关键词列表删除了
https://www.和https://t.me,避免重复匹配和无关内容命中,原有名称关键词已经可以覆盖所有目标行 - 内容拆分逻辑从按
*拆分改为按换行拆分,适配所有合约的注释格式,不会遗漏非*开头的目标行 - 新增去重逻辑+匹配即跳出循环的逻辑,彻底解决重复输出问题
- 每个地址输出完自动加空行分隔,和预期输出格式一致
内容的提问来源于stack exchange,提问作者rbutrnz
相关产品推荐
相关产品推荐

