网络爬虫--SAX处理xml

匿名 (未验证) 提交于 2019-12-03 00:26:01

使用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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!