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
相关产品推荐
相关产品推荐

