Python列表添加元素及BeautifulSoup爬取链接去重与打印问题求助
嘿,我来帮你搞定这两个技术问题!
问题1:如何在Python中向列表添加元素?
Python里给列表加元素有好几种常用方法,按需选就行:
- append():给列表末尾添加单个元素,比如
my_list.append("new_item"),这是最常用的方式 - extend():把另一个可迭代对象(比如列表、元组)的所有元素一次性加到列表末尾,比如
my_list.extend([1,2,3]) - insert():在指定索引位置插入元素,第一个参数是索引,第二个是元素,比如
my_list.insert(0, "first_item")会把元素插到列表最前面 - + 运算符:可以把两个列表拼接成一个新列表,比如
new_list = my_list + ["a", "b"],注意这会生成新列表,原列表不会改变
问题2:BeautifulSoup爬取链接的重复与打印问题
先看你代码里的核心问题:
- 重复链接的原因:你外层循环遍历的是
cnnSectBulletItems类的div,但内层循环却用soup.find_all('a')——这会每次都搜索整个页面的所有a标签,所以每遍历一个div,就把全页面的链接再添加一遍,自然就重复了!应该改成在当前的div(也就是循环里的links变量)里找a标签。 - 打印相关问题:你现在每次添加一个链接就打印一次,加上重复的情况,会输出大量冗余内容。可以等收集完所有链接后再统一打印,或者在循环里先做去重判断。
给你修正后的代码:
from bs4 import BeautifulSoup import requests address = "http://transcripts.cnn.com/TRANSCRIPTS/2018.04.29.html" page = requests.get(address) soup = BeautifulSoup(page.content, 'html.parser') articles = [] # 外层循环遍历目标div,内层在当前div范围内找a标签 for section in soup.find_all('div', {'class':'cnnSectBulletItems'}): for link in section.find_all('a'): article_href = link.get('href') # 先判断链接是否已存在,避免重复添加 if article_href not in articles: articles.append(article_href) # 收集完成后统一打印所有链接 for article in articles: print(article)
解释下改动点:
- 把内层的
soup.find_all('a')改成section.find_all('a'),只在当前的目标div里搜索链接,避免全局重复抓取 - 添加了
if article_href not in articles的判断,确保每个链接只被添加一次 - 把打印语句移到循环外面,等所有链接收集完再统一打印,输出更整洁
内容的提问来源于stack exchange,提问作者hard1009
相关产品推荐
相关产品推荐

