python读取本地html文件表格数据保存为csv格式

废话不多说,直接入正题,以下是我将要爬取的html文件部分内容:

python读取本地html文件表格数据保存为csv格式_第1张图片

文件中有10个样本信息的表格数据,爬取每个表格中的miRNA family 和count 列。

1、读取html

import urllib.request

url = 'file:///D:/***.html' 
html = urllib.request.urlopen(url).read() 

print(html)  # 打印查看

url是指html的文件地址,你可以直接打开html文件,复制网站粘贴即可,读取的是html源代码信息赋给变量html。

可以看到读取获得的html是一个很长的字符串,这种形式是不方便我们提取关键信息的,因此有必要将其重新解析为html格式。

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

print(soup)

python读取本地html文件表格数据保存为csv格式_第2张图片

2、提取关键信息

1)查看源代码

打开html文件,右击选择审查元素,点击左上角箭头图标,将光标移到表格内容上。

python读取本地html文件表格数据保存为csv格式_第3张图片

仔细观察你会发现每个样本的表格信息就保存在table标签中,10个table标签对应10个样本。

python读取本地html文件表格数据保存为csv格式_第4张图片

每个表格中的每一行又对应着table标签中的tr标签,一行中的每个数据就在tr标签中的td标签下。

python读取本地html文件表格数据保存为csv格式_第5张图片

2)提取信息

获取所有的table标签节点信息。

tables = soup.find_all('table')

print(len(tables)) # 查看标签数量

本例中存在11个table标签,其中第一个并不是我们所需要的,因此后续提取将略过第一个table标签。

for循环获取每个table标签中的样本名称及其表格数据。

for tab in tables[1:]:   # 从第2个table标签开始迭代循环,第一个标签为table[0]

    # 提取样本名称,样本名称在a标签中
    sample = tab.find_all('a')[0].get_text()  # 获取a标签文本信息
    sample_name = sample.split(' ')[1][:-2]   # 从文本中截取名称

    # 提取表格信息
    trs = tab.find_all('tr')  # 获取table中的所有tr标签

    for tr in trs[2:]:  # trs[0:1]不包含所需信息,因此略过
        miRNA_family = tr.find_all('td')[0].get_text()
        count = tr.find_all('td')[1].get_text()

现在,我们获取了所有表格的每一行数据,下一步就是保存数据。

3、数据保存

这里,我将每个样本都保存为一个csv文件。

import pandas as pd

content = [[miRNA_family, count]]
list_name = ['miRNA', 'count']
data = pd.DataFrame(columns=list_name, data=content)
data.to_csv("C:\\Users***\\{}.csv".format(sample_name), mode='a', header=False, encoding='utf-8')

4、完整代码

from bs4 import BeautifulSoup
import urllib.request
import pandas as pd

url = 'file:///D:/***.html'
html = urllib.request.urlopen(url).read()

soup = BeautifulSoup(html, "html.parser")

tables = soup.find_all('table')

for tab in tables[1:]:

    # 提取样本名称
    sample = tab.find_all('a')[0].get_text()
    sample_name = sample.split(' ')[1][:-2]

    # 提取表格信息
    trs = tab.find_all('tr')
    for tr in trs[2:]:
        miRNA_family = tr.find_all('td')[0].get_text()
        count = tr.find_all('td')[1].get_text()


        # 存储信息
        content = [[miRNA_family, count]]
        list_name = ['miRNA', 'count']
        data = pd.DataFrame(columns=list_name, data=content)
        data.to_csv("C:\\Users\\***\\{}.csv".format(sample_name), mode='a', header=False, encoding='utf-8')

5、重要模块/函数

1)urlopen函数

需要导入urllib.request模块,用于打开html文件,后加read()实现文件的读取。

2)BeautifulSoup模块

BeautifulSoup函数将文本字符串信息解析成html格式,即将原始的食材做出一桌的“佳肴”。find_all函数可以帮你找到你所需要的菜所在的盘子,继续find_all便可从盘子中挑出你想吃的菜,最后再用筷子get_text()夹起放入碗中。

3)pandas模块

Pandas模块是Python用于数据导入及整理的模块,对于数据的处理工作十分有用。这里简单介绍csv文件的保存,***.to_csv()函数中,***表示你要保存的数据变量,函数中第一个参数即保存文件的地址及文件名,mode = 'a'表示追加写入,header=False省略列名,有关to_csv的更多信息可以自行了解。

4)split函数与字符串切片

事实上,sample = tab.find_all('a')[0].get_text()语句获取的内容是:(Sample  ck-12h),而我只想要ck-12h。

先用空格分隔成两个片段:sample_1 = sample.split(' ')

返回一个列表值:['(sample', 'ck-12h)']

获取列表的第二个元素:sample_2 = sample_1[1]

返回一个字符串:ck-12h)

获取除“)"外的其他内容:sample_3 = sample_2[:-2]

返回我们想要的内容:ck-12

合在一起写就是:sample_name = sample.split(' ')[1][:-2]

 

你可能感兴趣的:(python,csv)