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:\软件\python\python_work\Python_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()