Python urllib 、XML和HTMLParser
参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1019223241745024 Python 的内建模块urllib提供了一系列用于操作url的方法 Geturllib的request可以非常方便的抓取URL的内容,通过GET发送一个请求到指定页面,然后返回HTTP响应 还可以模仿浏览器发送一个GET请求,需要request对象,通过向request对象中添加HTTP请求头,就可以把请求伪装为一个浏览器 Post需要把参数以bytes类型传入 Handler如果还需要更复杂的控制,加入需要通过一个代理去登陆网站,需要使用proxyhandler模块 ? urllib提供的功能就是通过程序完成各种各样的HTTP请求,如果需要模仿浏览器完成特定功能,需要将请求伪装为浏览器请求,伪装的方法是先监控浏览器发出的请求,然后再根据浏览器的请求头来伪装,User-Agent头就是用来识别浏览器的 ? XML参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017784095418144 操作XML有两种方法:DOM和SAX。DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。 正常情况下,优先考虑SAX,因为DOM实在太占内存。 注意使用attrs这个值 当SAX解析器读到一个节点时: <a href="/">python</a>
会产生3个事件:
什么是事件呢? from xml.parsers.expat import ParserCreate class DefaultSaxHandler(object): def start_element(self,name,attrs): print(‘sax:start_element:%s,attrs:%s‘%(name,str(attrs)))#这里可以写 当读到这里时要发生的事件 def end_element(self,name): print(‘sax:end_element:%s‘%name)#这里可以写 当读到这里时要发生的事件 def char_data(self,text): print(‘sax:char_data:%s‘%text)#这里可以写 当读到这里时要发生的事件 xml = r‘‘‘<?xml version="1.0"?> <ol> <li><a href="/python">Python</a></li> <li><a href="/ruby">Ruby</a></li> </ol> ‘‘‘ handler=DefaultSaxHandler() parser=ParserCreate() parser.StartElementHandler=handler.start_element parser.EndElementHandler=handler.end_element parser.CharacterDataHandler=handler.char_data parser.Parse(xml) #输出 sax:start_element:ol,attrs:{} sax:char_data: sax:char_data: sax:start_element:li,attrs:{} sax:start_element:a,attrs:{‘href‘: ‘/python‘} sax:char_data:Python sax:end_element:a sax:end_element:li sax:char_data: sax:char_data: sax:start_element:li,attrs:{‘href‘: ‘/ruby‘} sax:char_data:Ruby sax:end_element:a sax:end_element:li sax:char_data: sax:end_element:ol 需要注意的是读取一大段字符串时, 除了解析XML外,如何生成XML呢?99%的情况下需要生成的XML结构都是非常简单的,因此,最简单也是最有效的生成XML的方法是拼接字符串: 如果要生成复杂的XML呢?建议你不要用XML,改成JSON。 解析XML时,注意找出自己感兴趣的节点,响应事件时,把节点数据保存起来。解析完毕后,就可以处理数据。 比如可以解析XML数据获得相关城市的天气信息(略) ? HTMLParser参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017784593019776 当我们爬取了网页,下一步就是解析HTML页面,看看里面的内容,到底是图片、视频还是文本。 利用HTMLParser,可以把网页中的文本、图像等解析出来。 HTML本质上是XML的子集,但是语法没有XML要求的那么严格,所以不能通过标准的DOM或者SAX来解析HTML 好在Python提供了HTMLParser来非常方便地解析HTML,只需简单几行代码: 注意使用attrs这个值 from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser(HTMLParser): def handle_starttag(self,tag,attrs): print(‘<%s>‘ % tag) def handle_endtag(self,tag): print(‘</%s>‘ % tag) def handle_startendtag(self,attrs): print(‘<%s/>‘ % tag)#如img标签<img src="",/> def handle_data(self,data): print(data) def handle_comment(self,data): print(‘<!--‘,data,‘-->‘) def handle_entityref(self,name):#解析特殊字符 print(‘&%s;‘ % name) def handle_charref(self,name):#解析特殊字符 print(‘&#%s;‘ % name) parser = MyHTMLParser() parser.feed(‘‘‘<html> <head></head> <body> <!-- test html parser --> <p>Some <a href="#">html</a> HTML?tutorial...<br>END</p> </body></html>‘‘‘) #输出 (sort) λ python fortest.py <html> <head> </head> <body> <!-- test html parser --> <p> Some <a> html </a> HTML?tutorial... <br> END </p> </body> </html> 可是这样怎么识别有特定id的标签呢?,注意使用attrs这个值 def find_id(self,id_name,attrs): for i in attrs: if id_name in i: return True return False def handle_starttag(self,attrs): if self.find_id(‘test1‘,attrs): print(‘<%s%s>‘ %(tag,str(attrs))) pass parser.feed(‘‘‘<html> <head></head> <body> <!-- test html parser --> <p class=‘test‘ id=‘test1‘>Some <a href="#">html</a> HTML?tutorial...<br>END</p> </body></html>‘‘‘) #输出 pass <p[(‘class‘,‘test‘),(‘id‘,‘test1‘)]> pass
特殊字符有两种,一种是英文表示的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python – Google Dataflow上Apache Beam示例的权限错误
- python – 解压缩后无法删除压缩文件
- python – 访问csr_matrix中的特定行,列
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python – numpy.genfromtxt:delimiter =’,’无法拆分字符
- 免翻墙上google(python3.3版)已打包
- pytorch下使用LSTM神经网络写诗实例
- python – 一段时间后无法连续保存和更新.CSV文件
- Python pip升级及升级失败解决方案
- Django / MySQL:如何进行自治事务(仅提交查询子集)?