Python urllib 、XML和HTMLParser

Python urllib 、XML和HTMLParser,第1张

概述参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1019223241745024 Python 的内建模块urllib提供了一系列用于 *** 作url的方法 Get   urllib的request可以非常方便的抓取URL的内容,通过GET发送一个请求到指定页面,然后返回HTTP响应   还可以模仿浏览器发送一个GET请求,需要request

参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1019223241745024

Python 的内建模块urllib提供了一系列用于 *** 作url的方法

Get

  urllib的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个事件:

start_element事件,在读取<a href="/">时;

char_data事件,在读取python时;

end_element事件,在读取</a>时。

  什么是事件呢?

from xml.parsers.expat import ParserCreateclass 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_elementparser.EndElementHandler=handler.end_elementparser.CharacterDataHandler=handler.char_dataparser.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:Pythonsax:end_element:asax:end_element:lisax:char_data:sax:char_data:sax:start_element:li,attrs:{‘href‘: ‘/ruby‘}sax:char_data:Rubysax:end_element:asax:end_element:lisax:char_data:sax:end_element:ol

  需要注意的是读取一大段字符串时,CharacterDataHandler可能被多次调用,所以需要自己保存起来,在EndElementHandler里面再合并。

  除了解析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 HTMLParserfrom HTML.entitIEs import name2codepointclass 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>

  Feed()方法可以多次调用,也就是不一定一次把整个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

  

  特殊字符有两种,一种是英文表示的&nbsp;,一种是数字表示的&#1234;,这两种字符都可以通过Parser解析出来。

总结

以上是内存溢出为你收集整理的Python urllib 、XML和HTMLParser全部内容,希望文章能够帮你解决Python urllib 、XML和HTMLParser所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1190828.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存