废话不多说,直接入正题,以下是我将要爬取的html文件部分内容:
文件中有10个样本信息的表格数据,爬取每个表格中的miRNA family 和count 列。
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)
打开html文件,右击选择审查元素,点击左上角箭头图标,将光标移到表格内容上。
仔细观察你会发现每个样本的表格信息就保存在table标签中,10个table标签对应10个样本。
每个表格中的每一行又对应着table标签中的tr标签,一行中的每个数据就在tr标签中的td标签下。
获取所有的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()
现在,我们获取了所有表格的每一行数据,下一步就是保存数据。
这里,我将每个样本都保存为一个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')
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')
需要导入urllib.request模块,用于打开html文件,后加read()实现文件的读取。
BeautifulSoup函数将文本字符串信息解析成html格式,即将原始的食材做出一桌的“佳肴”。find_all函数可以帮你找到你所需要的菜所在的盘子,继续find_all便可从盘子中挑出你想吃的菜,最后再用筷子get_text()夹起放入碗中。
Pandas模块是Python用于数据导入及整理的模块,对于数据的处理工作十分有用。这里简单介绍csv文件的保存,***.to_csv()函数中,***表示你要保存的数据变量,函数中第一个参数即保存文件的地址及文件名,mode = 'a'表示追加写入,header=False省略列名,有关to_csv的更多信息可以自行了解。
事实上,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]