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

Python爬虫:无法在另一个函数内正确打印名称的问题

解决爬虫重复输出问题(保留for循环)

嘿,我明白你遇到的重复输出困扰了——咱们来快速搞定它,同时还能保住你要求的for loop!

问题根源

你当前的重复输出是因为get_info()函数里的for items in soup.select("ul.list-unstyled")会遍历页面上所有符合选择器的列表元素,每次循环都会执行print(title, phone)。但实际上只有其中一个列表包含电话号码,其他循环只会打印空的phone和重复的title,自然就出现了一堆冗余内容。

修正方案

我们可以在循环里找到包含电话号码的列表项后,立即打印并跳出循环,这样既保留了要求的for loop,又不会重复输出。下面是修正后的完整代码:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

url = "https://potguide.com/alaska/marijuana-dispensaries/"

def get_links(link):
    session = requests.Session()
    session.headers['User-Agent'] = 'Mozilla/5.0'
    r = session.get(link)
    soup = BeautifulSoup(r.text,"lxml")
    for items in soup.select("#StateStores .basic-listing"):
        name = items.select_one("h4 a").text
        namelink = urljoin(link,items.select_one("h4 a").get("href"))
        get_info(session,name,namelink)

def get_info(session, title, url):
    r = session.get(url)
    soup = BeautifulSoup(r.text,"lxml")
    phone = ""
    for items in soup.select("ul.list-unstyled"):
        try:
            phone = items.select_one("a[href^='tel:']").text
            # 找到电话后打印并跳出循环,终止后续不必要的遍历
            print(title, phone)
            break
        except AttributeError:
            # 没找到电话就继续下一个列表项
            continue
    # 处理页面完全没有电话的情况
    if not phone:
        print(title, phone)

if __name__ == '__main__':
    get_links(url)

效果验证

运行修正后的代码,你会得到完全符合预期的输出:

AK Frost (907) 563-9333
AK Fuzzy Budz (907) 644-2838

补充小技巧

如果页面上的联系方式列表有更精准的标识(比如带特定class),你也可以直接缩小选择范围,比如用soup.select("ul.list-unstyled.contact-info")(假设这个class对应联系方式模块),这样循环只会遍历目标列表,效率会更高,但上面的方案更通用,即使选择器范围大也能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:50:27