爬虫爬取网页上的表格

最近有个爬虫的需求,然后在做爬虫的过程中涉及到要去爬取网页中的表格内容,鉴于直接采用常规方法有点傻,于是记录了如何直接提取表格内的方法在此,以便后续再回顾。

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)

猜你喜欢

转载自blog.csdn.net/qq_27575895/article/details/88415358