Python处理CSV中URL:清洗、打开及内容写入新列方法咨询
嘿,作为有3年C语言业余开发经验的Python新手,你上手这些操作其实会比纯小白快很多!我来一步步帮你搞定这个需求:
第一步:清洗CSV中的URL列
你看到的b'https://...'格式,本质是把Python的字节串(bytes)直接以字符串形式存在了CSV里。我们要做的就是去掉冗余的前缀后缀,还原成标准URL字符串。
处理思路
- 用Python内置的
csv模块读取原CSV(不用额外安装,省心) - 遍历目标列的每个单元格,先去掉首尾空格,再剥离掉开头的
b'和结尾的'
代码示例(基础版)
假设你的CSV里URL列名叫"URL",先写个清洗的基础代码:
import csv input_file = "你的输入文件.csv" output_file = "清洗后的临时文件.csv" with open(input_file, 'r', encoding='utf-8') as in_csv, open(output_file, 'w', newline='', encoding='utf-8') as out_csv: reader = csv.DictReader(in_csv) writer = csv.DictWriter(out_csv, fieldnames=reader.fieldnames) writer.writeheader() for row in reader: # 清洗URL:先去空格,再剥离b'和' raw_url = row["URL"] cleaned_url = raw_url.strip().lstrip("b'").rstrip("'") row["URL"] = cleaned_url # 替换原列的内容 writer.writerow(row)
第二步:抓取链接内容并写入新列
接下来要抓取每个URL的网页文本,推荐用**requests**(发HTTP请求)+ BeautifulSoup4(解析HTML提取文本)的组合,这俩是Python爬虫的入门标配。
先安装依赖
打开终端跑这两条命令:
pip install requests pip install beautifulsoup4
整合代码(抓取+写入新列)
把清洗和抓取逻辑合并,直接输出带新列的CSV:
import csv import requests from bs4 import BeautifulSoup input_file = "你的输入文件.csv" output_file = "带内容的最终文件.csv" # 模拟浏览器请求头,避免被网站拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } with open(input_file, 'r', encoding='utf-8') as in_csv, open(output_file, 'w', newline='', encoding='utf-8') as out_csv: reader = csv.DictReader(in_csv) # 给输出文件新增一列,比如叫"帖子内容" output_fields = reader.fieldnames + ["帖子内容"] writer = csv.DictWriter(out_csv, fieldnames=output_fields) writer.writeheader() for row in reader: # 第一步:清洗URL raw_url = row["URL"] cleaned_url = raw_url.strip().lstrip("b'").rstrip("'") row["URL"] = cleaned_url # 第二步:抓取网页内容 content = "" try: # 发送GET请求 response = requests.get(cleaned_url, headers=headers, timeout=10) response.raise_for_status() # 请求失败直接抛出异常 # 解析HTML提取文本 soup = BeautifulSoup(response.text, 'html.parser') # 针对Facebook帖子,找对应的内容区域(class可能会变,不行就用下面的全局文本) post_divs = soup.find_all('div', class_='x193iq5w xeuugli x13faqbe x1vvkbs x1xmvt09 x1lliihq x1s928wv xhkezso x1gmr53x x1cpjm7i x1fgarty x1943h6x xudqn12 x3x7a5m x6prxxf xvq8zen xo1l8bm xzsf02u') if post_divs: content = "\n".join([div.get_text(strip=True) for div in post_divs]) else: # 找不到特定区域就提取页面所有文本(会有冗余,但总比空着好) content = soup.get_text(strip=True, separator='\n') except Exception as e: # 抓取失败时记录错误信息,不中断整个程序 content = f"抓取失败:{str(e)}" row["帖子内容"] = content writer.writerow(row)
注意事项
- 反爬问题:Facebook对非浏览器请求很敏感,可能会拦截或者要求登录。如果上面的代码抓不到内容,可以试试用
selenium模拟真实浏览器操作(需要装ChromeDriver),不过30个链接的话,先加了请求头试试,大概率能行。 - 编码问题:读写CSV一定要加
encoding='utf-8',不然中文或者特殊字符容易乱码。 - 异常处理:代码里加了
try-except,就算某个链接无效或者抓取失败,程序也会继续处理剩下的链接,不会直接崩溃。
内容的提问来源于stack exchange,提问作者robertsmith
相关产品推荐
相关产品推荐

