1 #解析字符窜形式html 2 3 text=''' 4 <div> 5 <ul> 6 <li class="item-1"><a href="link1.html">张三</a></li> 7 <li class="item-2"><a href="link2.html">李四</a></li> 8 <li class="item-3"><a href="link3.html">王五</a> 9 </ul> 10 </div> 11 ''' 12 from lxml import etree 13 # etree.HTML()将字符窜解析成特殊的html对象 14 html=etree.HTML(text) 15 # 将html对象转换成字符窜 16 res=etree.tostring(html,encoding="utf-8").decode() 17 print(res) 18 19 20 #解析本地html 21 #爬虫中网页处理方式: 22 # 1、在爬虫中,数据获取和数据清洗一体,HTML() 23 # 2、数据获取和数据清洗分开,parse() 24 html=etree.parse(r"123.html") 25 res=html.xpath("//a") #获取所有a标签中的内容 26 print(res[0].text) #返回结果是一个列表对象地址,取任意一个元素,解析成文本格式 27 28 29 30 # #获取指定属性的标签 31 html=etree.parse(r"123.html") 32 res=html.xpath("//li/a[@href='link3.html']") #获取所有li标签下的a标签中指定属性包裹的信息 33 print(res[0].text) 34 35 36 #获取标签的属性 37 html=etree.parse(r"123.html") 38 res=html.xpath("//li/@class") #获取所有li标签中的calss属性值 39 res1=html.xpath("//li/a/@href") 40 print(res) #直接生成列表,打印出来,因为属性值下没有其它的标签了 41 print(res1) 42 #一般情况下,需要拿到a标签下href中的网址, 43 for i in res1: 44 requests.get(i) 45 46 47 48 #获取子标签 49 from lxml import etree 50 html=etree.parse(r"123.html") 51 # res=html.xpath("//li/a") #获取所有li标签下一级标签 52 # res1=html.xpath("//li//span") #获取所有li下所有符合的子标签 53 res2=html.xpath("//li//@href") #获取所有li标签下的所有href属性 54 print(res2) 55 56 57 58 #获取标签名和内容 59 html=etree.parse(r"123.html") 60 res=html.xpath("//li[last()-1]/a") #获取倒数第二个a标签下的内容 61 res1=html.xpath("//li/a") 62 print(res1[-2].text) #获取倒数第二个a标签下的内容,text表示获取标签内容 63 64 #获取class属性值为item-2的标签 65 html=etree.parse(r"123.html") 66 res=html.xpath("//*[@class='item-2']") 67 print(res[0].tag) #tag表示获取标签名
1 #爬取段子中的文字部分 2 3 import requests 4 from lxml import etree 5 header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36"} 6 url="https://ishuo.cn/" 7 txt=requests.get(url,headers=header).text 8 html=etree.HTML(txt) 9 res=html.xpath('//div[@class="info"]/a') #获取所有div标签下倒数第一个a标签中href属性值 10 print(res[0].text) 11 12 #https://ishuo.cn/subject/5899 13 14 for i in res: 15 xurl="https://ishuo.cn"+i 16 resp2=requests.get(xurl).text 17 html2=etree.HTML(resp2) 18 res2=html2.xpath("//div[@class='content']") #获取div标签下class属性值为content的内容,段子中的文字部分 19 print(res2[0].text) 20 21 22 23 #爬取贴吧中的图片 24 import urllib 25 from urllib import request 26 from lxml import etree 27 class Spider(): 28 def __init__(self): 29 self.tiebaName="周杰伦" 30 self.beginpage=1 31 self.endpage=3 32 self.url="http://tieba.baidu.com/f?" 33 self.ua_header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36;"} 34 self.filename=1 35 #构造url 36 def tiebaspider(self): 37 for page in range(self.beginpage,self.endpage+1): 38 pn=(page-1)*50 39 wo={"kw":self.tiebaName} 40 word=urllib.parse.urlencode(wo) #构造URL编码 41 myurl=self.url+word+"&pn="+str(pn) #形成完整的URL 42 self.loadpage(myurl) #调用下一个方法,传入url 43 44 #爬起网页内容 45 def loadpage(self,url): #接收上一个方法传入的myurl参数 46 req=request.Request(url,headers=self.ua_header) 47 data=request.urlopen(req).read().decode() 48 print(data) #打印所爬取的3页网页的信息 49 html_new = data.replace(r'<!--', '"').replace(r'-->', '"') #将网页内容的注释取消 50 html=etree.HTML(html_new) 51 links=html.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href') 52 print(links) 53 for link in links: 54 link="http://tieba.baidu.com"+link 55 self.loadImages(link) 56 57 58 #爬取图片所在的链接 59 def loadImages(self,link): 60 req=request.Request(link,headers=self.ua_header) 61 data=request.urlopen(req).read() 62 # print(data) 63 html=etree.HTML(data) 64 links=html.xpath('//img[@class="BDE_Image"]/@src') #获取图片的链接 65 print(links) 66 for link in links: 67 self.writeImages(link) 68 69 #通过图片所在的链接,将图片写入到本地 70 def writeImages(self,imageslink): 71 72 print("正在下载图片:",self.filename,"...") 73 resp=request.urlopen(imageslink).read() 74 with open(r"D:软件pythonpython_workPython_day17图片下载\"+str(self.filename)+".jpg","wb") as f: 75 f.write(resp) 76 self.filename+=1 77 78 if __name__=='__main__': 79 mySpider=Spider() 80 mySpider.tiebaspider()