Python网络爬虫--数据提取xpath

一、xpath简介

XPath,即为XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某部分位置的语言。

xml和html异同:

都是玩标签,标签中都有属性
xml必须为双标签,html单双都可
xml标签为自定义,html标签都为内置

XPath 使用路径表达式在 XML 文档中进行导航

XPath 包含一个标准函数库

XPath 是 XSLT 中的主要元素

XPath 是一个 W3C 标准

二、xpath使用

xpath使用:

1.导入lxml.etree:from lxml import etree
2.etree.parse() 解析本地文件, 将html变为Python中的树形结构
html_tree = etree.parse(‘xx.html’,parser=) # parser为转换器
3.etree.HTML() 服务器响应文件,将html变为Python中的树形结构
html_tree = etree.HTML(response.read().decode(‘utf-8’))
4.html_tree.xpath(xpath路径)

基本语法:

1.路径查询
//:查找所有的子孙结点,不考虑层级关系
/: 找直接子节点
2.谓词查询
//div[@id]
//div[@id=“maincontent”]
3. 属性查询
//@class
4.模糊查询
//div[contains(@id,“he”)]
//div[starts-with(@id,“he”)]
5.内容查询
//div/h1/text()
6.逻辑运算
//div[@id=“head” and @class=“s_down”]
//title | //price
7.匹配未知结点
*,匹配任意元素
8.取反:not

三、懒加载策略

图片在页面结构渲染好以后才会加载,所有利用element可能获取不到属性值。

对象默认为空
当我们真正需要获取的时候,第一次获取会被实例化出来
当我们第二次到第N次获取,会使用第一次实例化出来的值

解决方法:

1.点开source查看页面源码,找到对应的属性值
2.利用selenium可视化爬取

四、xpath helper 插件

练习:

# 爬取糗事百科笑话,并将头像,用户名,内容,点赞数存入mysql
import uuid

import pymysql
import requests
from lxml import etree

# 内容采集
url = 'https://www.qiushibaike.com/text/'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
response = requests.get(url, headers=headers)

contents = response.text

# 唯一值的生成
filename = uuid.uuid4().hex + '.jpg'
# xpath提取
html_etree = etree.HTML(contents, parser=etree.HTMLParser())
jokes = html_etree.xpath('//div[contains(@id,"qiushi_tag_")]')
for joke in jokes:
    names = joke.xpath('./div/a/h2/text()')[0]
    joke_content = joke.xpath('./a/div/span/text()')[0]
    joke_good = joke.xpath('./div/span/i/text()')[0]
    icons = joke.xpath('./div/a/img/@src')
    icons_content = 'https:' + icons[0]
    print([icons_content,names.strip(),joke_content.strip(),joke_good.strip()])


    # 导入数据库
    conn = pymysql.Connect(host='localhost',user='root',password='6666',db='mydb1',port=3306)
    cursor = conn.cursor()
    sql = "insert into data(url,name,content,num) values('%s','%s','%s','%s')"%(icons_content,names,joke_content,joke_good)
    num = cursor.execute(sql)
conn.close()
cursor.close()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值