4-数据提取方法2(xpath和lxml)(6节课学会爬虫)

发布于:2024-07-05 ⋅ 阅读:(17) ⋅ 点赞:(0)

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)

网站公告

今日签到

点亮在社区的每一天
去签到