You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
修改说明
  1. 新增请求头模拟浏览器访问,解决bscscan反爬导致的内容缺失问题,第二个地址的匹配结果可以正常返回
  2. 关键词列表删除了https://www.和https://t.me,避免重复匹配和无关内容命中,原有名称关键词已经可以覆盖所有目标行
  3. 内容拆分逻辑从按*拆分改为按换行拆分,适配所有合约的注释格式,不会遗漏非*开头的目标行
  4. 新增去重逻辑+匹配即跳出循环的逻辑,彻底解决重复输出问题
  5. 每个地址输出完自动加空行分隔,和预期输出格式一致

内容的提问来源于stack exchange,提问作者rbutrnz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:21:02