4-数据提取方法2(xpath和lxml)(6节课学会爬虫)
- 1,Xpath语法:
- (1)选择节点(标签)
- (2)“//”:能从任意节点开始选择
- (3)“@”符号的用途
- (4)获取文本
- (5)点前
- 2,简单使用
- (1)判断某个标签是否被选中
- (2)选择当前页面的任何一个节点(双斜杠//)
- (3)选择指定的标签
- 3,Lxml(在代码中使用xpath语法)
- (1)安装
- (2)使用
- (3)爬取豆瓣电影
1,Xpath语法:
Xpath
是一门从HTML中提取数据的一门语言
Xpath helper插件:
帮助我们从element中定位数据
爬虫是爬不到element的内容的,这里使用插件只是让其帮助我们学习xpath中的语法,从url地址中的响应中提取数据,只有response内容和element中内容相同时,才可以使用此工具提取数据,否则只能看response内容才能去提取,当然xpath语法简单,看就能看到。
(1)选择节点(标签)
-- /html/head/meta:
能够选中html下的head下的所有的meta标签
(2)“//”:能从任意节点开始选择
“//li”:
当前页面下的所有li标签
“/html/head//link”:
选择head下的所有link标签(head下的任意一级都会被选中)
(3)“@”符号的用途
定位元素:“//ul[@class="topic_ul"]/li”
选择class="topic_ul"
的ul标签下的li标签
“/a/@href”:
选择a标签的href属性值
(4)获取文本
“/a/text()”:
获取文本(标签a中包含的文本)
“/a//text()”:
获取a标签下的所有文本,即便a标签下有其他标签,所有的文本都会得到
(5)点前
“./a”:
当前节点下的a标签
相应方法可到w3cschool中查找,上面学到的已经能解决80%的问题了
@
可以定位一个属性,一个节点
选择节点(标签)
2,简单使用
(1)判断某个标签是否被选中
如下,选择全部的meta都选择上了
(2)选择当前页面的任何一个节点(双斜杠//)
我们如果从根路径,一个一个的去找太麻烦了,而且使用鼠标找到某一标签后,使用//
可以得到当前页面的任意节点。
可以选择整个页面下的任何一个li
标签
(3)选择指定的标签
@
符号能选择指定属性的值
[]
能对选择的标签进行限定
3,Lxml(在代码中使用xpath语法)
(1)安装
pip install lxml
(2)使用
from lxml import etree
element = etree.HTML("html字符串") #etree可以将HTML的字符串转换成一个对象
element.xpath("/html/head/meta") #此时可以对此对象使用xpath语法了
(3)爬取豆瓣电影
下方式爬取豆瓣电影排行榜的某一页的电影信息的爬虫程序
#-*- codeing = utf-8 -*-
#@Time : 2020/12/10 14:50
#@Author : 招财进宝
#@File : 09_try_lxml.py
#@Software: PyCharm
import requests
from lxml import etree
url="https://movie.douban.com/chart"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
response = requests.get(url,headers=headers)
html_str = response.content.decode()
#print(html_str)
#使用etree处理数据
html = etree.HTML(html_str) #etree可以将HTML的字符串转换成一个对象
print(html) #一个element对象,可以进行xpath撰写
#此时可以对此对象使用xpath语法了
# #1.获取所有的电影的url地址
# url_list = html.xpath("//div[@class='indent']/div/table//div[@class='pl2']/a/@href")
# print(url_list)
#
# #2.获取所有的图片的url地址
# img_list = html.xpath("//div[@class='indent']/div/table//a[@class='nbg']/img/@src")
# print(img_list)
#3.需要把每部电影组成一个字典,字典中是电影的多重数据,如标题,url,图片地址,评论数,评分
# 思路:
#1.分组
#2.每一组提取数据
ret1 = html.xpath("//div[@class='indent']/div/table") #通过此中方式先对每个模块进行分组
print(ret1) #[<Element table at 0x278cea01708>, <Element table at 0x278bed91708>,共10个table的对象
for table in ret1:
item = {}
item["title"]=table.xpath(".//div[@class='pl2']/a/text()")[0].replace("/","").strip() #此处只有中文的电影名
#print(item["title"])
item["href"] = table.xpath(".//div[@class='pl2']/a/@href")[0]
item["img"] = table.xpath(".//a[@class='nbg']/img/@src")[0]
item["comment_num"] = table.xpath(".//span[@class='pl']/text()")[0]
item["rating_num"] = table.xpath(".//span[@class='rating_nums']/text()")[0]
print(item)