基于Python实现一键批量查询邮编

 更新时间:2023年08月02日 10:38:59   作者:上景  
这篇文章主要为大家详细介绍了如何利用Python快速实现查询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("查询完毕")

到此这篇关于基于Python实现一键批量查询邮编的文章就介绍到这了,更多相关Python查询邮编内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论