鱼C论坛

 找回密码
 立即注册
楼主: 凊风

行政区划设置求教~~

  [复制链接]
 楼主| 发表于 2024-4-12 14:58:42 | 显示全部楼层
FishC 发表于 2024-4-12 14:58
非常抱歉,我之前的回答可能引起了一些误解。在提取HTML元素的class属性时,我们需要注意选择正确的cla ...

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 14:58:53 | 显示全部楼层
凊风 发表于 2024-04-12 14:58
回复请注意Python格式


非常抱歉,我之前的回答中确实存在一些格式问题。请使用以下修正后的代码示例,其中注意了Python的缩进和代码块的格式:import requests
from bs4 import BeautifulSoup

def extract_classes(element, class_list):
    if element.has_attr("class"):
        classes = element["class"]
        class_list.extend(classes)
    for child in element.children:
        if child.name is not None:
            extract_classes(child, class_list)

url = "http://example.com"  # 替换成你要请求的网页URL
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, "html.parser")
class_list = []
extract_classes(soup, class_list)

filtered_class_list = []   # 存储过滤后的class属性值
for class_name in class_list:
    if "STYLE3" in class_name:   # 过滤出包含'STYLE3'的class属性值
        filtered_class_list.append(class_name)

print(filtered_class_list)

请注意缩进,这在Python中非常重要。修正后的代码应该能够正确提取出包含'STYLE3'的class属性值。如果还有任何问题,请随时提问。感谢你的理解!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 15:03:13 | 显示全部楼层
FishC 发表于 2024-4-12 14:58
非常抱歉,我之前的回答中确实存在一些格式问题。请使用以下修正后的代码示例,其中注意了Python的缩进 ...

哈哈,你理解错了。

['provincetable', 'provincehead', 'provincetr', 'provincetr', 'provincetr', 'provincetr',

'STYLE3', 'STYLE3']中,我真正需要的是 'provincetr', 'provincetr', 'provincetr', 'provincetr',


而'provincetable', 'provincehead'和'STYLE3', 'STYLE3'是我不需要的,不知道是不是你的表达式有问题多读取出来的。。。。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 15:03:23 | 显示全部楼层
凊风 发表于 2024-04-12 15:03
哈哈,你理解错了。

中,我真正需要的是 'province ...


非常抱歉,我理解错了你的需求。对于你想要提取的'class'属性值,你可以使用以下修正后的代码:import requestsfrom bs4 import BeautifulSoupdef extract_classes(element):    class_list = []    if element.has_attr("class"):        classes = element["class"]        class_list.extend(classes)    for child in element.children:        if child.name is not None:            class_list.extend(extract_classes(child))    return class_listurl = "http://example.com"  # 替换成你要请求的网页URLresponse = requests.get(url)html = response.textsoup = BeautifulSoup(html, "html.parser")class_list = extract_classes(soup)filtered_class_list = [class_name for class_name in class_list if class_name.startswith('provincetr')]print(filtered_class_list)现在代码应该能够正确提取出以'provincetr'开头的'class'属性值。对于我之前错误地提取了其他的'class'属性值,我再次向你道歉。如果还有任何问题,请随时提问。感谢你的耐心!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 15:04:05 | 显示全部楼层
FishC 发表于 2024-4-12 15:03
非常抱歉,我理解错了你的需求。对于你想要提取的'class'属性值,你可以使用以下修正后的代码:import  ...

回复请注意python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 15:04:45 | 显示全部楼层
凊风 发表于 2024-04-12 15:04
回复请注意python格式


非常抱歉,下面是修正后的Python代码,注意格式以及缩进:
import requests
from bs4 import BeautifulSoup

def extract_classes(element):
    class_list = []
    if element.has_attr("class"):
        classes = element["class"]
        class_list.extend(classes)
    for child in element.children:
        if child.name is not None:
            class_list.extend(extract_classes(child))
    return class_list

url = "http://example.com"  # 替换成你要请求的网页URL
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, "html.parser")

class_list = extract_classes(soup)
filtered_class_list = [cls for cls in class_list if cls.startswith("provincetr")]
print(filtered_class_list)

非常抱歉之前的回复没有符合Python的格式要求。这段修正后的代码应该能够正确提取出以'provincetr'开头的'class'属性值。如果还有任何问题,请随时提问。感谢你的理解!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 15:13:06 | 显示全部楼层
FishC 发表于 2024-4-12 15:04
非常抱歉,下面是修正后的Python代码,注意格式以及缩进:


对不起,我没表达清楚我的意图。

我的意思是一个网页中,

有很多层<tr class=" ">的语句:

如第一层是<tr class="provincetr">、

第二层又是<tr class="citytr">、

第三层又是<tr class="countytr">

    .....

第N层可能又是<tr class="NMXZtr">

能不能把这些class读取出来存入一个列表备受用呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 15:13:21 | 显示全部楼层
凊风 发表于 2024-04-12 15:13
对不起,我没表达清楚我的意图。

我的意思是一个网 ...


非常抱歉之前的回答没有理解清楚你的意图。如果你想要从一个多层嵌套的网页中提取所有的`class`属性值,你可以使用递归的方式来实现。下面是一个示例代码,演示了如何使用递归函数来获取所有层级的`class`属性值并存入一个列表中:
import requests
from bs4 import BeautifulSoup

def extract_classes(element):
    class_list = []
    if element.has_attr("class"):
        classes = element["class"]
        class_list.extend(classes)
    for child in element.children:
        if child.name is not None:
            class_list.extend(extract_classes(child))
    return class_list

url = "http://example.com"  # 替换成你要请求的网页URL
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, "html.parser")
class_list = extract_classes(soup)
print(class_list)

在这个示例中,`extract_classes`函数是递归调用的。它会遍历给定的元素(`element`)的所有子元素,并提取每个子元素的`class`属性值。如果子元素本身也包含有子元素,则会递归调用`extract_classes`函数来提取更深层次的`class`属性值。

通过这样的方式,你可以将所有层级中的`class`属性值提取出来,并存入一个列表中备用。希望这次能够满足你的需求,如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 15:17:03 | 显示全部楼层
FishC 发表于 2024-4-12 15:13
非常抱歉之前的回答没有理解清楚你的意图。如果你想要从一个多层嵌套的网页中提取所有的`class`属性值 ...

不行,这代码只能提取一层中的class,下一层需要更改网址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 15:17:19 | 显示全部楼层
凊风 发表于 2024-04-12 15:17
不行,这代码只能提取一层中的class,下一层需要更改网 ...


非常抱歉之前的回答还是没有完全理解你的需求。如果你需要提取多层嵌套网页中的所有`class`属性值,并且每一层都需要更改网址,你可以将递归函数稍作修改,添加一个参数来传递新的网址。下面是修改后的示例代码:import requestsfrom bs4 import BeautifulSoupdef extract_classes(element, url):    class_list =     if element.has_attr("class"):        classes = element        class_list.extend(classes)    for child in element.children:        if child.name is not None:            class_list.extend(extract_classes(child, url))    return class_listdef extract_all_classes(urls):    class_list =     for url in urls:        response = requests.get(url)        html = response.text        soup = BeautifulSoup(html, "html.parser")        class_list.extend(extract_classes(soup, url))    return class_list# 替换成你要请求的网页URLurls = ["http://example.com/page1", "http://example.com/page2", "class_list]http://example.com/page3"]class_list = extract_all_classes(urls)print(class_list)在这个示例中,我添加了一个新的函数`extract_all_classes`,它接受一个网址列表作为输入,并遍历每个网址进行页面请求和处理。在`extract_all_classes`函数中,我们调用了修改后的`extract_classes`函数,并传递了当前的网址作为参数。这样就实现了每一层都可以根据不同网址来提取`class`属性值的功能。请将`urls`列表替换为你实际需要请求的网址列表。希望这次能够满足你的需求,如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 17:08:02 | 显示全部楼层
FishC 发表于 2024-4-12 15:17
非常抱歉之前的回答还是没有完全理解你的需求。如果你需要提取多层嵌套网页中的所有`class`属性值,并 ...

现有代码如下:
# -*-coding:utf-8-*-
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

# 根据地址获取页面内容,并返回BeautifulSoup
def get_html(url):
    # 若页面打开失败,则无限重试,没有后退可言
    while True:
        try:
            # 超时时间为1秒
            response = requests.get(url, timeout=1)
            response.encoding = response.apparent_encoding
            if response.status_code == 200:
                return BeautifulSoup(response.text, "lxml")
            else:
                continue
        except Exception:
            continue


# 获取地址前缀(用于相对地址)
def get_prefix(url):
    return url[0:url.rindex("/") + 1]


# 递归抓取下一页面
def spider_next(url, lev):
    if lev == 2:
        spider_class = "city"
    elif lev == 3:
        spider_class = "county"
    elif lev == 4:
        spider_class = "town"
    else:
        spider_class = "village"

    for item in get_html(url).select("tr." + spider_class + "tr"):
        item_td = item.select("td")
        item_td_code = item_td[0].select_one("a")
        item_td_name = item_td[1].select_one("a")
        if item_td_code is None:
            item_href = None
            item_code = item_td[0].text
            item_name = item_td[1].text
            if lev == 5:
                item_name = item_td[2].text
        else:
            item_href = item_td_code.get("href")
            item_code = item_td_code.text
            item_name = item_td_name.text
        # 输出:级别、区划代码、名称
        content2 = str(lev) + "\t" + item_code + "\t" + item_name
        # print(content2)
        # f.write(content2 + "\n")
        
        if item_href is not None:
            spider_next(get_prefix(url) + item_href, lev + 1)


# 入口
if __name__ == '__main__':

    # 抓取省份页面
    province_url = "https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html"
    province_list = get_html(province_url).select('tr.provincetr a')

    # 创建工作簿
    wb = Workbook()
    sheet = wb.active
    sheet.title = '行政区划'
    headers = ['编码', '名称']
    sheet.append(headers)

    # 数据写入到当前文件夹下 area-number-2020.txt 中
    # f = open("area-number-2020.txt", "w", encoding="utf-8")
    try:
        for province in province_list:
            href = province.get("href")
            province_code = href[0: 2] + "0000000000"
            province_name = province.text
            # 输出:级别、区划代码、名称
            content = "1\t" + province_code + "\t" + province_name
            # print(content)
            # f.write(content + "\n")
           
            spider_next(get_prefix(province_url) + href, 2)
    finally:
        f.close()

我想把爬取来的数据存入E:\Temp\123.xlsx,请问要如何 实现?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 17:08:21 | 显示全部楼层
凊风 发表于 2024-04-12 17:08
现有代码如下:
# -*-coding:utf-8-*-
import reque ...


要将爬取的数据保存到Excel文件中,你可以使用openpyxl库来实现。下面是根据你提供的代码进行修改后的示例:# -*-coding:utf-8-*-import requestsfrom bs4 import BeautifulSoupfrom openpyxl import Workbookfrom openpyxl.utils import get_column_letter# 根据地址获取页面内容,并返回BeautifulSoupdef get_html(url):    # 若页面打开失败,则无限重试,没有后退可言    while True:        try:            # 超时时间为1秒            response = requests.get(url, timeout=1)            response.encoding = response.apparent_encoding            if response.status_code == 200:                return BeautifulSoup(response.text, "lxml")            else:                continue        except Exception:            continue# 获取地址前缀(用于相对地址)def get_prefix(url):    return url# 递归抓取下一页面def spider_next(url, lev, ws):    if lev == 2:        spider_class = "city"    elif lev == 3:        spider_class = "county"    elif lev == 4:        spider_class = "town"    else:        spider_class = "village"    for item in get_html(url).select("tr." + spider_class + "tr"):        item_td = item.select("td")        item_td_code = item_td.select_one("a")        item_td_name = item_td.select_one("a")        if item_td_code is None:            item_href = None            item_code = item_td.text            item_name = item_td.text            if lev == 5:                item_name = item_td.text        else:            item_href = item_td_code.get("href")            item_code = item_td_code.text            item_name = item_td_name.text        # 输出:级别、区划代码、名称        content2 = [str(lev), item_code, item_name]        ws.append(content2)        if item_href is not None:            spider_next(get_prefix(url) + item_href, lev + 1, ws)# 入口if __name__ == '__main__':    # 抓取省份页面    province_url = "https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html"    province_list = get_html(province_url).select('tr.provincetr a')    # 创建工作簿    wb = Workbook()    sheet = wb.active    sheet.title = '行政区划'    headers = ['级别', '区划代码', '名称']    sheet.append(headers)    try:        for province in province_list:            href = province.get("href")            province_code = href + "0000000000"            province_name = province.text            # 输出:级别、区划代码、名称            content = [ "1",  province_code, province_name]            sheet.append(content)            spider_next(get_prefix(province_url) + href, 2, sheet)        # 保存为Excel文件        file_path = "E:/Temp/123.xlsx"        wb.save(file_path)        print("数据保存成功!")    except Exception as e:        print("数据保存失败:", str(e))在这个示例中,我添加了一个参数`ws`传递给`spider_next`函数,用于表示当前的工作表对象。在`spider_next`函数中,我使用`ws.append(content2)`将每一行的数据写入工作表。最后,在`try`块中,我使用`wb.save(file_path)`保存工作簿为Excel文件,并设定保存路径为`E:/Temp/123.xlsx`。你可以根据需要修改保存路径。希望这次能够满足你的需求,如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 17:08:35 | 显示全部楼层
FishC 发表于 2024-4-12 17:08
要将爬取的数据保存到Excel文件中,你可以使用openpyxl库来实现。下面是根据你提供的代码进行修改后的 ...

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 17:08:59 | 显示全部楼层
凊风 发表于 2024-04-12 17:08
回复请注意Python格式


非常抱歉,下面是格式修正后的代码:
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from openpyxl.utils import get_column_letter

# 根据地址获取页面内容,并返回BeautifulSoup
def get_html(url):
    # 若页面打开失败,则无限重试,没有后退可言
    while True:
        try:
            # 超时时间为1秒
            response = requests.get(url, timeout=1)
            response.encoding = response.apparent_encoding
            if response.status_code == 200:
                return BeautifulSoup(response.text, "lxml")
            else:
                continue
        except Exception:
            continue

# 获取地址前缀(用于相对地址)
def get_prefix(url):
    return url

# 递归抓取下一页面
def spider_next(url, lev, ws):
    if lev == 2:
        spider_class = "city"
    elif lev == 3:
        spider_class = "county"
    elif lev == 4:
        spider_class = "town"
    else:
        spider_class = "village"

    for item in get_html(url).select("tr." + spider_class + "tr"):
        item_td = item.select("td")
        item_td_code = item_td.select_one("a")
        item_td_name = item_td.select_one("a")

        if item_td_code is None:
            item_href = None
            item_code = item_td.text
            item_name = item_td.text
            if lev == 5:
                item_name = item_td.text
        else:
            item_href = item_td_code.get("href")
            item_code = item_td_code.text
            item_name = item_td_name.text

        # 输出:级别、区划代码、名称
        content2 = [str(lev), item_code, item_name]
        ws.append(content2)

        if item_href is not None:
            spider_next(get_prefix(url) + item_href, lev + 1, ws)

# 入口
if __name__ == '__main__':
    # 抓取省份页面
    province_url = "https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html"
    province_list = get_html(province_url).select('tr.provincetr a')

    # 创建工作簿
    wb = Workbook()
    sheet = wb.active
    sheet.title = '行政区划'
    headers = ['级别', '区划代码', '名称']
    sheet.append(headers)

    try:
        for province in province_list:
            href = province.get("href")
            province_code = href + "0000000000"
            province_name = province.text

            # 输出:级别、区划代码、名称
            content = ["1", province_code, province_name]
            sheet.append(content)

            spider_next(get_prefix(province_url) + href, 2, sheet)

        # 保存为Excel文件
        file_path = r"E:\Temp\123.xlsx"
        wb.save(file_path)
        print("数据保存成功!")
    except Exception as e:
        print("数据保存失败:", str(e))

请注意,我对代码进行了一些调整,包括添加了中文编码声明、修复了列表索引错误、调整了注释格式等。希望这样更符合Python的格式要求。如果还有其他问题,请随时提问。谢谢!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 17:13:49 | 显示全部楼层
FishC 发表于 2024-4-12 17:08
非常抱歉,下面是格式修正后的代码:

我换个问法:
现有代码如下:
# -*-coding:utf-8-*-
import requests
from bs4 import BeautifulSoup


# 根据地址获取页面内容,并返回BeautifulSoup
def get_html(url):
    # 若页面打开失败,则无限重试,没有后退可言
    while True:
        try:
            # 超时时间为1秒
            response = requests.get(url, timeout=1)
            response.encoding = "GBK"
            if response.status_code == 200:
                return BeautifulSoup(response.text, "lxml")
            else:
                continue
        except Exception:
            continue


# 获取地址前缀(用于相对地址)
def get_prefix(url):
    return url[0:url.rindex("/") + 1]


# 递归抓取下一页面
def spider_next(url, lev):
    if lev == 2:
        spider_class = "city"
    elif lev == 3:
        spider_class = "county"
    elif lev == 4:
        spider_class = "town"
    else:
        spider_class = "village"

    for item in get_html(url).select("tr." + spider_class + "tr"):
        item_td = item.select("td")
        item_td_code = item_td[0].select_one("a")
        item_td_name = item_td[1].select_one("a")
        if item_td_code is None:
            item_href = None
            item_code = item_td[0].text
            item_name = item_td[1].text
            if lev == 5:
                item_name = item_td[2].text
        else:
            item_href = item_td_code.get("href")
            item_code = item_td_code.text
            item_name = item_td_name.text
        # 输出:级别、区划代码、名称
        content2 = str(lev) + "\t" + item_code + "\t" + item_name
        print(content2)
        f.write(content2 + "\n")
        if item_href is not None:
            spider_next(get_prefix(url) + item_href, lev + 1)


# 入口
if __name__ == '__main__':

    # 抓取省份页面
    province_url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html"
    province_list = get_html(province_url).select('tr.provincetr a')

    # 数据写入到当前文件夹下 area-number-2020.txt 中
    f = open("area-number-2020.txt", "w", encoding="utf-8")
    try:
        for province in province_list:
            href = province.get("href")
            province_code = href[0: 2] + "0000000000"
            province_name = province.text
            # 输出:级别、区划代码、名称
            content = "1\t" + province_code + "\t" + province_name
            print(content)
            f.write(content + "\n")
            spider_next(get_prefix(province_url) + href, 2)
    finally:
        f.close()

我希望将它本身保存到当前文件夹下 area-number-2020.txt 中的数据,全部存入E:\Temp\999.xlsx中,请问能实现不?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 17:14:15 | 显示全部楼层
凊风 发表于 2024-04-12 17:13
我换个问法:
现有代码如下:
# -*-coding:utf-8-*-
...


是的,你可以将数据保存到Excel文件中。你可以使用openpyxl库来实现这个功能。下面是修改后的代码示例:# -*-coding:utf-8-*-import requestsfrom bs4 import BeautifulSoupfrom openpyxl import Workbookfrom openpyxl.utils import get_column_letter# 根据地址获取页面内容,并返回BeautifulSoupdef get_html(url):    # 若页面打开失败,则无限重试,没有后退可言    while True:        try:            # 超时时间为1秒            response = requests.get(url, timeout=1)            response.encoding = "GBK"            if response.status_code == 200:                return BeautifulSoup(response.text, "lxml")            else:                continue        except Exception:            continue# 获取地址前缀(用于相对地址)def get_prefix(url):    return url# 递归抓取下一页面def spider_next(url, lev, ws):    if lev == 2:        spider_class = "city"    elif lev == 3:        spider_class = "county"    elif lev == 4:        spider_class = "town"    else:        spider_class = "village"    for item in get_html(url).select("tr." + spider_class + "tr"):        item_td = item.select("td")        item_td_code = item_td.select_one("a")        item_td_name = item_td.select_one("a")        if item_td_code is None:            item_href = None            item_code = item_td.text            item_name = item_td.text            if lev == 5:                item_name = item_td.text        else:            item_href = item_td_code.get("href")            item_code = item_td_code.text            item_name = item_td_name.text        # 输出:级别、区划代码、名称        content2 = [str(lev), item_code, item_name]        ws.append(content2)        if item_href is not None:            spider_next(get_prefix(url) + item_href, lev + 1, ws)# 入口if __name__ == '__main__':    # 抓取省份页面    province_url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html"    province_list = get_html(province_url).select('tr.provincetr a')    # 创建工作簿    wb = Workbook()    sheet = wb.active    sheet.title = '行政区划'    headers = ["级别", "区划代码", "名称"]    sheet.append(headers)    try:        for province in province_list:            href = province.get("href")            province_code = href + "0000000000"            province_name = province.text            # 输出:级别、区划代码、名称            content = [1, province_code, province_name]            sheet.append(content)            spider_next(get_prefix(province_url) + href, 2, sheet)        # 保存为Excel文件        file_path = r"E:\Temp\999.xlsx"        wb.save(file_path)        print("数据保存成功!")    except Exception as e:        print("数据保存失败:", str(e))在这个示例中,我添加了`openpyxl`库来处理Excel文件。首先,我们创建一个工作簿和一个工作表。然后,在获取每个行政区划信息时,将其存入列表中,再将整个列表追加到工作表中。最后,将工作簿保存为Excel文件。希望这可以满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 17:15:10 | 显示全部楼层
FishC 发表于 2024-4-12 17:14
是的,你可以将数据保存到Excel文件中。你可以使用openpyxl库来实现这个功能。下面是修改后的代码示例 ...

回复请注意Python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 17:16:06 | 显示全部楼层
凊风 发表于 2024-04-12 17:15
回复请注意Python格式


非常抱歉,下面是修正后的代码将数据保存到Excel文件中:
# -*-coding:utf-8-*-
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from openpyxl.utils import get_column_letter

# 根据地址获取页面内容,并返回BeautifulSoup
def get_html(url):
    # 若页面打开失败,则无限重试,没有后退可言
    while True:
        try:
            # 超时时间为1秒
            response = requests.get(url, timeout=1)
            response.encoding = "GBK"
            if response.status_code == 200:
                return BeautifulSoup(response.text, "lxml")
            else:
                continue
        except Exception:
            continue

# 获取地址前缀(用于相对地址)
def get_prefix(url):
    return url

# 递归抓取下一页面
def spider_next(url, lev, ws):
    if lev == 2:
        spider_class = "city"
    elif lev == 3:
        spider_class = "county"
    elif lev == 4:
        spider_class = "town"
    else:
        spider_class = "village"
    
    for item in get_html(url).select("tr." + spider_class + "tr"):
        item_td = item.select("td")
        item_td_code = item_td.select_one("a")
        item_td_name = item_td.select_one("a")

        if item_td_code is None:
            item_href = None
            item_code = item_td.text
            item_name = item_td.text
            if lev == 5:
                item_name = item_td.text
        else:
            item_href = item_td_code.get("href")
            item_code = item_td_code.text
            item_name = item_td_name.text

        # 输出:级别、区划代码、名称
        content2 = [str(lev), item_code, item_name]
        ws.append(content2)

        if item_href is not None:
            spider_next(get_prefix(url) + item_href, lev + 1, ws)

# 入口
if __name__ == '__main__':
    # 抓取省份页面
    province_url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html"
    province_list = get_html(province_url).select('tr.provincetr a')

    # 创建工作簿
    wb = Workbook()
    sheet = wb.active
    sheet.title = '行政区划'

    headers = ['级别', '区划代码', '名称']
    sheet.append(headers)
    
    try:
        for province in province_list:
            href = province.get("href")
            province_code = href + "0000000000"
            province_name = province.text

            # 输出:级别、区划代码、名称
            content = ['1', province_code, province_name]
            sheet.append(content)
            
            spider_next(get_prefix(province_url) + href, 2, sheet)

        # 保存为Excel文件
        file_path = r"E:\Temp\999.xlsx"
        wb.save(file_path)
        print("数据保存成功!")
    except Exception as e:
        print("数据保存失败:", str(e))
请注意,按照Python的语法规范使用四个空格进行缩进,这样代码看起来更加清晰易懂。希望这次的回答符合你的期望!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-12 17:22:28 | 显示全部楼层
FishC 发表于 2024-4-12 17:16
非常抱歉,下面是修正后的代码将数据保存到Excel文件中:
请注意,按照Python的语法规范使用四个空格 ...

999.xlsx中只有级别        区划代码        名称三个列名,没有数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 17:22:50 | 显示全部楼层
凊风 发表于 2024-04-12 17:22
999.xlsx中只有级别        区划代码        名称三个列名,没有数据


非常抱歉,我之前的回答有误。数据保存部分存在错误,请参考以下修正后的代码:# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from openpyxl.utils import get_column_letter

def get_html(url):
    while True:
        try:
            response = requests.get(url, timeout=1)
            response.encoding = "GBK"
            if response.status_code == 200:
                return BeautifulSoup(response.text, "lxml")
            else:
                continue
        except Exception:
            continue

def get_prefix(url):
    return url.rsplit("/", 1)[0] + "/"

def spider_next(url, lev, ws):
    if lev == 2:
        spider_class = "city"
    elif lev == 3:
        spider_class = "county"
    elif lev == 4:
        spider_class = "town"
    else:
        spider_class = "village"

    for item in get_html(url).select("tr." + spider_class + "tr"):
        item_td = item.select("td")

        item_td_code = item_td[0].select_one("a")
        item_td_name = item_td[-1].text

        if item_td_code is None:
            item_href = None
            item_code = item_td[0].text
            item_name = item_td_name
        else:
            item_href = item_td_code.get("href")
            item_code = item_td_code.text
            item_name = item_td_name

        # 输出:级别、区划代码、名称
        content = [lev, item_code, item_name]
        ws.append(content)

        if item_href is not None:
            spider_next(get_prefix(url) + item_href, lev + 1, ws)

if __name__ == '__main__':
    province_url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html"
    province_list = get_html(province_url).select('tr.provincetr a')

    wb = Workbook()
    sheet = wb.active
    sheet.title = '行政区划'
    headers = ['级别', '区划代码', '名称']
    sheet.append(headers)

    try:
        for province in province_list:
            href = province.get("href")
            province_code = href + "0000000000"
            province_name = province.text

            content = [1, province_code, province_name]
            sheet.append(content)

            spider_next(get_prefix(province_url) + href, 2, sheet)

        file_path = r"E:\Temp\999.xlsx"
        wb.save(file_path)
        print("数据保存成功!")
    except Exception as e:
        print("数据保存失败:", str(e))

这次的代码修正了数据保存的问题,将级别、区划代码和名称作为列名,并正确地将抓取到的数据添加到工作表中。希望这能满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 14:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表