请问对于未命名的列索引应该怎么编码提取?
在Excel中未命名列位于第二行
import requests
from lxml import etree
import pandas as pd
url = 'https://www.dytt8.net/html/gndy/dyzz/index.html'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}
MOVIE = {}
def get_main_url(url):
"""获取传入url里获取的所有电影列表的详情页面的url"""
ori_url = 'https://www.dytt8.net'
resp = requests.get(url=url, headers=HEADERS)
text = resp.content.decode("gbk", 'ignore') # 可能有gbk都处理不了的特殊字符,必须传入ignore参数
html = etree.HTML(text)
tables = html.xpath("//table[@class='tbspan']")
det_url_list = []
for table in tables:
detail_ur = table.xpath(".//a/@href")[0]
detail_urls = ori_url + detail_ur
det_url_list.append(detail_urls)
return det_url_list
def get_detail_page(url, i):
resp = requests.get(url=url, headers=HEADERS)
text = resp.content.decode("gbk", 'ignore')
html = etree.HTML(text)
MOVIE['索引'] = [i]
title = html.xpath("//div[@class='title_all']//font[@color='#07519a']/text()")[0]
MOVIE['电影名'] = title
zooms = html.xpath("//div[@id='Zoom']")[0]
try:
poster = zooms.xpath(".//img/@src")[0]
MOVIE['海报地址'] = poster
except IndexError:
MOVIE['海报地址'] = ['获取失败']
def parser_cont(cont, rule):
return content.replace(rule, '').strip()
contents = zooms.xpath(".//text()")
for index, content in enumerate(contents):
if content.startswith('◎产 地'):
content = parser_cont(content, '◎产 地')
MOVIE['制片国家'] = content
elif content.startswith('◎类 别'):
content = parser_cont(content, '◎类 别')
MOVIE['类别'] = content
elif content.startswith('◎上映日期'):
content = parser_cont(content, '◎上映日期')
MOVIE['上映日期'] = content
elif content.startswith('◎豆瓣评分'):
content = parser_cont(content, '◎豆瓣评分')
MOVIE['豆瓣评分'] = content
elif content.startswith('◎片 长'):
content = parser_cont(content, '◎片 长')
MOVIE['片长'] = content
elif content.startswith('◎主 演'):
content = parser_cont(content, '◎主 演')
actors = [content]
MOVIE['主演'] = actors
for x in range(index + 1, len(contents)):
actor_main = contents[x].strip()
if actor_main.startswith('◎'):
break
actors.append(actor_main)
return MOVIE
def spider():
i = 0
base_url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
for x in range(1, 8):
# 第一个for循环用来获取七页电影列表的url
url = base_url.format(x)
det_url_list = get_main_url(url)
for det_url in det_url_list:
# 这里的for循环用来获取每一页包含的每一部电影的详情页面的url
get_detail_page(det_url, i)
i += 1
print(MOVIE)
movies = pd.read_excel('./movie.xlsx')
movie = pd.Series(MOVIE, name='i')
movies = movies.append(movie, ignore_index=True)
movies.to_excel('./movie.xlsx')
if __name__ == "__main__":
spider()
我对Python中Excel表格的处理不是特别熟悉,不过我可以按照要求提供以下方法尽可能地解决这个问题:
首先需要导入pandas模块,因为Pandas支持大多数的Excel表格功能且数据分析能力很强。那么如何安装它呢? 运行pip install pandas即可。
接下来,将Excel表格读入。Pandas拥有read_excel方法,可以直接读取Excel文件(xlsx, xls等格式)。
读取Excel文件的方法非常简单。可以直接利用pandas.read_excel()快速读取excel文件,读取excel文件时,可以轻松的指定sheet名,如以下代码中的"Sheet2":
import pandas as pd df_new = pd.read_excel(r'./test.xls', sheet_name='Sheet2') print(df_new)
但是,读取这种表格中的未命名的列索引,需要用到Pandas的一些高级操作。参考这个链接,使用MultiIndex数据格式就是解决这个问题的好方法。当Pandas读取一个没有列名的Excel文件时,将自动赋值一些虚拟列名(A,B,C等等)。你是否想过可以取出这些虚拟列名,并将它们变成一个多层索引呢?这样就可以即保留数据,又可以用一个合理的方式解决未命名的列索引的问题。
具体步骤如下:
1.读取Excel文件,将虚拟的列标题存储在multiIndex对象中。
2.删除所有空的行。
3.转置整个DataFrame.
4.重置multiIndex,将它变成一个正常的列,而不是索引。
这是一个完整的例子如下所示: 我假定这个未命名的列索引在第二行之后,它的值为"key1,key2,key3"。
import pandas as pd df = pd.read_excel(r'File.xlsx') cols = pd.MultiIndex.from_tuples([(x, y) for x in df.columns[2:] for y in ['key1', 'key2', 'key3']]) df.columns = pd.Index(['First', 'Second']).union(cols) df = df.dropna(how='all') df = df.T.reset_index(level=1, drop=True).T
这段程序不是特别容易懂,需要花一些时间理解,但是一旦你懂了,你就知道如何把多维无序的数据转换为带有规律格式的数据。我认为这种方案是处理这个问题的最佳方法,因为它不仅适用于这个特定的例子,而且也适用于其他一些可能包含多维数据的情况。
至于如何将转换后的Excel表格通过Python添加到字典中,只需要使用Pandas来完成,它具有很强的操作数据的能力。你可以将DataFrame格式化成字典格式(dict),并将'First'作为键名,将其他的值作为值:
dict_excel=df.to_dict('list')
如果你使用了类似上面的代码,作为结果将产生一个所有数据都清晰可见的字典。