通过邮编查地址——第二种方式(可以实现邮编一键批量查询,省市县分开输出)

帮对象处理所需数据时写的代码——第三弹(实现功能:可以快速实现查询excel表格里所有邮编对应的地址信息,将输出的省市县信息分开放在不同的单元格中)

目录

第 1 节:导入库

第 2 节:从网页中提取元素的函数

第 3 节:输入和输出文件路径

第 4 节:处理邮政编码和存储结果

第 5 节:将结果保存到输出文件

第 6 节:代码总结

第 7 节:代码运行实例

完整程序:


第 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("查询完毕")

 如有不足,欢迎留言指正交流哈!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~玲儿响叮当~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值