帮对象处理所需数据时写的代码——第三弹(实现功能:可以快速实现查询excel表格里所有邮编对应的地址信息,将输出的省市县信息分开放在不同的单元格中)
目录
第 1 节:导入库
本节导入所需的 Python 库:
pandas:用于数据操作和使用 Excel 文件。
requests:用于向网站发出 HTTP GET 请求。
bs4(BeautifulSoup):用于解析 HTML 内容。
tqdm:用于在处理邮政编码期间显示进度条。
import pandas as pd
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm #列中不能有空值
第 2 节:从网页中提取元素的函数
本节定义了extract_elements以 apostal_code作为输入的函数。它使用提供的邮政编码向网站“ https://www.youbianku.com/ ”发送 HTTP GET 请求。然后,它使用 BeautifulSoup 解析 HTML 内容,并使用 CSS 选择器从网页中提取特定元素。如果找到所有必需的元素,则提取并返回它们的文本值;否则,返回 None。
def extract_elements(postal_code):
url = f"https://www.youbianku.com/{postal_code}"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
element_1 = soup.select_one("#mw-content-text > div.mw-parser-output > div:nth-child(2) > div > span:nth-child(2) > a > span")
element_2 = soup.select_one("#mw-content-text > div.mw-parser-output > div:nth-child(2) > div > span:nth-child(3) > a > span")
element_3 = soup.select_one("#mw-content-text > div.mw-parser-output > div:nth-child(2) > div > span:nth-child(4) > a > span")
if element_1 and element_2 and element_3:
text_1 = element_1.text
text_2 = element_2.text
text_3 = element_3.text.replace(f"{text_1}{text_2}", "")
return text_1, text_2, text_3
else:
return None
第 3 节:输入和输出文件路径
在本节中,指定输入和输出文件路径。input_file保存输入 Excel 文件的路径,同时output_file保存将创建的输出 Excel 文件的路径。该程序还使用读取输入 Excel 文件pd.read_excel()并将“POST”列中的值检索到postal_codes列表中。
# 读取Excel文件
input_file = r"C:\Users\aa\Desktop\POST.xlsx"
output_file = r"C:\Users\aa\Desktop\P.xlsx"
df = pd.read_excel(input_file)
# 获取列名称为 "POST" 的数据
postal_codes = df["POST"].tolist()
第 4 节:处理邮政编码和存储结果
此部分处理列表中的每个邮政编码postal_codes。它调用该extract_elements函数从网站中检索每个邮政编码的元素。如果找到元素,它们将与邮政编码一起存储在字典中并附加到列表中results。如果未找到元素,则存储空字符串。显示进度条tqdm以指示处理进度。最后,results列表被转换为 pandas DataFrame output_df。
# 处理邮政编码并将结果存储在新的DataFrame中
results = []
with tqdm(total=len(postal_codes), desc="Processing") as pbar:
for postal_code in postal_codes:
elements = extract_elements(str(postal_code))
if elements:
element_1, element_2, element_3 = elements
results.append({"Postal Code": postal_code, "Element 1": element_1, "Element 2": element_2, "Element 3": element_3})
else:
results.append({"Postal Code": postal_code, "Element 1": "", "Element 2": "", "Element 3": ""})
pbar.update(1)
output_df = pd.DataFrame(results)
第 5 节:将结果保存到输出文件
在本节中,DataFrame将保存到使用output_df指定的输出 Excel 文件中。该参数确保行索引不包含在输出中,打印消息“查询完毕”(查询完成),表明程序已经执行完毕。
# 将结果保存到新的Excel文件中
output_df.to_excel(output_file, index=False)
# 输出查询完毕字样
print("查询完毕")
第 6 节:代码总结
1.从网页中提取特定元素:代码使用requests库发送HTTP GET请求,通过BeautifulSoup库解析TML内容,并使用CSS选择器从网页中提取特定元素。这些元素可能包含在给定的邮政编码对应的网页中。如果成功到提取所有所需元素后,则将它们的值存储起来,以供后续处理。
2.处理邮政编码数据:代码读取输入的Excel文件,获取包含邮政编码的列数据。然后,对每个邮政编码进行处理,调用提取元素的函数,把提取到的元素及对应的邮政编码存储中结果列表中。如果某个邮政编码无法提取到所需元素,则将空字符串存储占位符。整个处理过程中,通过使用库显示细节条,提供处理细节的可视化tqdm。
3.将结果保存到Excel文件:将处理得到的结果列表转换为pandasDataFrame,然后将其保存到指定的输出Excel文件中。最终,代码打印出“查询完毕”的提示信息,表示程序执行完毕。
第 7 节:代码运行实例
输入文件:
输出文件(省市县是分开输出的):
完整程序:
import pandas as pd
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm #列中不能有空值
def extract_elements(postal_code):
url = f"https://www.youbianku.com/{postal_code}"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
element_1 = soup.select_one("#mw-content-text > div.mw-parser-output > div:nth-child(2) > div > span:nth-child(2) > a > span")
element_2 = soup.select_one("#mw-content-text > div.mw-parser-output > div:nth-child(2) > div > span:nth-child(3) > a > span")
element_3 = soup.select_one("#mw-content-text > div.mw-parser-output > div:nth-child(2) > div > span:nth-child(4) > a > span")
if element_1 and element_2 and element_3:
text_1 = element_1.text
text_2 = element_2.text
text_3 = element_3.text.replace(f"{text_1}{text_2}", "")
return text_1, text_2, text_3
else:
return None
# 读取Excel文件
input_file = r"C:\Users\aa\Desktop\POST.xlsx"
output_file = r"C:\Users\aa\Desktop\P.xlsx"
df = pd.read_excel(input_file)
# 获取列名称为 "POST" 的数据
postal_codes = df["POST"].tolist()
# 处理邮政编码并将结果存储在新的DataFrame中
results = []
with tqdm(total=len(postal_codes), desc="Processing") as pbar:
for postal_code in postal_codes:
elements = extract_elements(str(postal_code))
if elements:
element_1, element_2, element_3 = elements
results.append({"Postal Code": postal_code, "Element 1": element_1, "Element 2": element_2, "Element 3": element_3})
else:
results.append({"Postal Code": postal_code, "Element 1": "", "Element 2": "", "Element 3": ""})
pbar.update(1)
output_df = pd.DataFrame(results)
# 将结果保存到新的Excel文件中
output_df.to_excel(output_file, index=False)
# 输出查询完毕字样
print("查询完毕")
如有不足,欢迎留言指正交流哈!!!