使用SAX处理xml 实际上有一个固定的框架,即标签开始,标签结束,文本处理。以下面例子讲解
出来book.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> </bookstore>
SAX代码如下:
from xml.parsers.expat import ParserCreate #从xml分析器中导入自定义的分析器 class DefaultSaxHander(object): #建一个默认的Sax处理器(当然类的名字可以自己定义) def start_element(self,name,attrs): #标签处理开始,有标签名和属性 self.name = name print('element: %s, attrs: %s' %(self.name,str(attrs))) def end_element(self,name): #标签处理结束 print('end element: %s' % name) def char_data(self,text): #处理文本 if text.strip(): #如果有text的前后有空格,\n,\t等,则去掉,如果内容仅仅为\t\n或空格则不打印 print('%s\'s text is %s'%(self.name,text)) handler = DefaultSaxHander() #生成Sax处理器 #初始化分析器 parser = ParserCreate() parser.StartElementHandler = handler.start_element parser.EndElementHandler = handler.end_element parser.CharacterDataHandler = handler.char_data #打开文本,读取文件 with open(r'/media/sf_Share/LSPE/r_0.11/book.xml','r') as f: parser.Parse(f.read()) #整个文件一起读(大文件可以一行一行读取)
以上就是一个sax处理器的基本模样,有三部分,标签开始,标签结束,和文本处理,当一切都定义好之后就直接将值扔给ParserCreate,它自己内部知道怎么处理,所以像parser.StartElementHandler、parser.EndElementHandler,parser.CharacterDataHandler这些名字是默认的,不能写错,如Start写成star则会找不到模块。
结果如下:
element: bookstore, attrs: {} #找到的第一个标签名为bookstore,属性为空,即没有属性 element: book, attrs: {} #第二个标签为book,属性为空 element: title, attrs: {'lang': 'eng'} #第三个标签为title,属性名为lang,值为eng title's text is Harry Potter #文本内容 end element: title #title结束,进入下一个标签 element: price, attrs: {} #标签为price,没有属性 price's text is 29.99 #标签内容 end element: price end element: book element: book, attrs: {} element: title, attrs: {'lang': 'eng'} title's text is Learning XML end element: title element: price, attrs: {} price's text is 39.95 end element: price end element: book #结束book标签 end element: bookstore #结束bookstore标签
从上面看到,SAX解析出来的xml是有层级的,一层一层处理
转载请标明出处:网络爬虫--SAX处理xml
文章来源: 网络爬虫--SAX处理xml