python实现将html表格转换成CSV文件的方法


Posted in Python onJune 28, 2015

本文实例讲述了python实现将html表格转换成CSV文件的方法。分享给大家供大家参考。具体如下:

使用方法:python html2csv.py *.html
这段代码使用了 HTMLParser 模块

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
# Hello, this program is written in Python - http://python.org
programname = 'html2csv - version 2002-09-20 - http://sebsauvage.net'
import sys, getopt, os.path, glob, HTMLParser, re
try:  import psyco ; psyco.jit() # If present, use psyco to accelerate the program
except: pass
def usage(progname):
  ''' Display program usage. '''
  progname = os.path.split(progname)[1]
  if os.path.splitext(progname)[1] in ['.py','.pyc']: progname = 'python '+progname
  return '''%s
A coarse HTML tables to CSV (Comma-Separated Values) converter.
Syntax  : %s source.html
Arguments : source.html is the HTML file you want to convert to CSV.
      By default, the file will be converted to csv with the same
      name and the csv extension (source.html -> source.csv)
      You can use * and ?.
Examples  : %s mypage.html
      : %s *.html
This program is public domain.
Author : Sebastien SAUVAGE <sebsauvage at sebsauvage dot net>
     http://sebsauvage.net
''' % (programname, progname, progname, progname)
class html2csv(HTMLParser.HTMLParser):
  ''' A basic parser which converts HTML tables into CSV.
    Feed HTML with feed(). Get CSV with getCSV(). (See example below.)
    All tables in HTML will be converted to CSV (in the order they occur
    in the HTML file).
    You can process very large HTML files by feeding this class with chunks
    of html while getting chunks of CSV by calling getCSV().
    Should handle badly formated html (missing <tr>, </tr>, </td>,
    extraneous </td>, </tr>...).
    This parser uses HTMLParser from the HTMLParser module,
    not HTMLParser from the htmllib module.
    Example: parser = html2csv()
         parser.feed( open('mypage.html','rb').read() )
         open('mytables.csv','w+b').write( parser.getCSV() )
    This class is public domain.
    Author: Sébastien SAUVAGE <sebsauvage at sebsauvage dot net>
        http://sebsauvage.net
    Versions:
      2002-09-19 : - First version
      2002-09-20 : - now uses HTMLParser.HTMLParser instead of htmllib.HTMLParser.
            - now parses command-line.
    To do:
      - handle <PRE> tags
      - convert html entities (&name; and &#ref;) to Ascii.
      '''
  def __init__(self):
    HTMLParser.HTMLParser.__init__(self)
    self.CSV = ''   # The CSV data
    self.CSVrow = ''  # The current CSV row beeing constructed from HTML
    self.inTD = 0   # Used to track if we are inside or outside a <TD>...</TD> tag.
    self.inTR = 0   # Used to track if we are inside or outside a <TR>...</TR> tag.
    self.re_multiplespaces = re.compile('\s+') # regular expression used to remove spaces in excess
    self.rowCount = 0 # CSV output line counter.
  def handle_starttag(self, tag, attrs):
    if  tag == 'tr': self.start_tr()
    elif tag == 'td': self.start_td()
  def handle_endtag(self, tag):
    if  tag == 'tr': self.end_tr()
    elif tag == 'td': self.end_td()     
  def start_tr(self):
    if self.inTR: self.end_tr() # <TR> implies </TR>
    self.inTR = 1
  def end_tr(self):
    if self.inTD: self.end_td() # </TR> implies </TD>
    self.inTR = 0      
    if len(self.CSVrow) > 0:
      self.CSV += self.CSVrow[:-1]
      self.CSVrow = ''
    self.CSV += '\n'
    self.rowCount += 1
  def start_td(self):
    if not self.inTR: self.start_tr() # <TD> implies <TR>
    self.CSVrow += '"'
    self.inTD = 1
  def end_td(self):
    if self.inTD:
      self.CSVrow += '",' 
      self.inTD = 0
  def handle_data(self, data):
    if self.inTD:
      self.CSVrow += self.re_multiplespaces.sub(' ',data.replace('\t',' ').replace('\n','').replace('\r','').replace('"','""'))
  def getCSV(self,purge=False):
    ''' Get output CSV.
      If purge is true, getCSV() will return all remaining data,
      even if <td> or <tr> are not properly closed.
      (You would typically call getCSV with purge=True when you do not have
      any more HTML to feed and you suspect dirty HTML (unclosed tags). '''
    if purge and self.inTR: self.end_tr() # This will also end_td and append last CSV row to output CSV.
    dataout = self.CSV[:]
    self.CSV = ''
    return dataout
if __name__ == "__main__":
  try: # Put getopt in place for future usage.
    opts, args = getopt.getopt(sys.argv[1:],None)
  except getopt.GetoptError:
    print usage(sys.argv[0]) # print help information and exit:
    sys.exit(2)
  if len(args) == 0:
    print usage(sys.argv[0]) # print help information and exit:
    sys.exit(2)    
  print programname
  html_files = glob.glob(args[0])
  for htmlfilename in html_files:
    outputfilename = os.path.splitext(htmlfilename)[0]+'.csv'
    parser = html2csv()
    print 'Reading %s, writing %s...' % (htmlfilename, outputfilename)
    try:
      htmlfile = open(htmlfilename, 'rb')
      csvfile = open( outputfilename, 'w+b')
      data = htmlfile.read(8192)
      while data:
        parser.feed( data )
        csvfile.write( parser.getCSV() )
        sys.stdout.write('%d CSV rows written.\r' % parser.rowCount)
        data = htmlfile.read(8192)
      csvfile.write( parser.getCSV(True) )
      csvfile.close()
      htmlfile.close()
    except:
      print 'Error converting %s    ' % htmlfilename
      try:  htmlfile.close()
      except: pass
      try:  csvfile.close()
      except: pass
  print 'All done. '

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
决策树的python实现方法
Nov 18 Python
python使用分治法实现求解最大值的方法
May 12 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
基于Python实现对PDF文件的OCR识别
Aug 05 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
Python连接DB2数据库
Aug 27 Python
发布你的Python模块详解
Sep 15 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
手把手教你使用Python创建微信机器人
Apr 29 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 #Python
python自动zip压缩目录的方法
Jun 28 #Python
python查找指定具有相同内容文件的方法
Jun 28 #Python
python中getaddrinfo()基本用法实例分析
Jun 28 #Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 #Python
分析用Python脚本关闭文件操作的机制
Jun 28 #Python
python实现linux下使用xcopy的方法
Jun 28 #Python
You might like
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
Laravel实现表单提交
2017/05/07 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
javascript 日期时间 转换的方法
2013/02/21 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
python插入排序算法的实现代码
2013/11/21 Python
python网页请求urllib2模块简单封装代码
2014/02/07 Python
答题辅助python代码实现
2018/01/16 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
单位在职证明范本
2014/01/09 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript