最近有个爬虫的需求,然后在做爬虫的过程中涉及到要去爬取网页中的表格内容,鉴于直接采用常规方法有点傻,于是记录了如何直接提取表格内的方法在此,以便后续再回顾。
from bs4 import BeautifulSoup
import urllib
import re
import config #自己定义的配置文件
def spider_data(url):
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
data=urllib.request.Request(url=url,headers=head)
file= urllib.request.urlopen(data)
res=file.read().decode('utf8','ignore')
soup=BeautifulSoup(res,'html.parser')
return soup
def split_table(soup):
res= []
if soup.tbody !=None:
a = soup.tbody.children
reg = re.compile(("<[^>]*>")) # 清除html标签,提取文本,这里查找的是介于'<>'之间的表达式
row0 = [] # row0用于保存上一行的信息
flag = True # row0未初始化
for child in a:
# 保存表格提取结果
if child.find('th'): # 提取表格字段
for value in child.children:
st = reg.sub('', str(value)) # 将'<>'之间直接进行去除
res.append((st.strip('\n')))
res= '-'.join(res)
continue
if child.find('td'): # 提取每一行,通过id标签辨别
while child.find('sup'):
child.find('sup').extract()
for value in child.children:
st = reg.sub('', str(value))
res.append(st.strip('\n'))
if flag:
flag = False
if len(res) < len(row0): # 与上一行比较,分析是否需要处理字段缺省的情况
row_temp = row0[0:len(row0) - len(res)]
for i in range(len(res)):
row_temp.append(res[i])
row0 = row_temp
row_temp = '-'.join(row_temp) # 将列表保存的字段连接起来
print(row_temp)
continue
row0 = res
#print(res)
return res
if __name__=='__main__':
base_soup = spider_data(config.base_url)
table=split_table(base_soup)