xpah的使用

目录

基本介绍

基本使用

案例


基本介绍

为什么要学习xpath?

  1. scrapy框架支持xpath提取

  2. selenium 经常使用xpath提取

  3. 使用简洁 语法稍稍复杂

xpath是什么?

  1. 全称 xml path language

  2. 从xml中提取数据的语言

  3. bs4按照标签名和属性进行查找, xpath 通过路径查找 也可以按照标签名和属性进行查找,通过一个具体的获得数据

html和lxml和xml:

  1. html 超文本标记语言

  2. xml 可扩展标记语言

  3. lxml python的第三方库 使用lxml下的etree模块把html转化为lxml对象

  4. 转换之后才能进行xpath提取

怎么使用?

  1. 官方文档 lxml - Processing XML and HTML with Python 英文文档

  2. 浏览器插件 chrome浏览器 xpath helper 直接在网页上就行xpath提取

基本使用

# 1 安装
#   pip install lxml
# 2 导包
#   from lxml import etree
# 3 把html文件转为lxml对象
#   xml = etree.HTML(网页源代码)
# 4 使用xpath语句进行提取
#   xml.xpath(xpath语句)
from lxml import etree

xml_content = '''
<html>
    <body>
        <title class='eng'>aaa</title>
        <a lang='aaa'>bbb</a>
        <bookstore>
            <title lang='eng'>bookstore</title>
                <book>
                    <title lang='eng'>Harry Potter</title>
                    <title lang='eng'>aaa</title>
                    <title lang='eng'>333</title>
                    <author>JK.Rowing</author>
                    <year id='aaa'>2005</year>
                    <price>29<price>
                </book>
        </bookstore>
    </body>
</html>
'''

# 把html转化为lxml对象 <class 'lxml.etree._Element'>
# 自动补全
xml = etree.HTML(xml_content)

# print(type(xml))

# / 从根节点进行选取 默认返回列表
title = xml.xpath('/html/body/bookstore/book/title')[0]


# etree.tostring(xml,encoding='utf-8') 把lxml对象转为字符串
# print(etree.tostring(xml,encoding='utf-8'))

# print(etree.tostring(title,encoding='utf-8'))

# // 从当前节点进行选取 不考虑标签的位置
# /text()取出标签内的文本
# print(xml.xpath('//bookstore//title/text()'))

# [@属性名] 查找携带lang属性的title标签
# *代表所有的标签名
# print(xml.xpath('//*[@lang]/text()'))
# print(xml.xpath('//title[@lang]/text()'))

# [@属性名='属性值']
# *可以用于代替属性名
print(xml.xpath('//*[@*="aaa"]/text()'))


# /title[2] 取出第n个title标签
print(xml.xpath('//title[1]/text()'))

# [/text()='xxxx'] 通过文本进行查找
print(xml.xpath('//*[text()="aaa"]/text()'))

# /@属性名 取出属性
print(xml.xpath('//*[text()="bookstore"]/@lang'))

# . 选取当前节点
book = xml.xpath('//book/*')

print(book.xpath('./title[1]/text()'))

# for i in book:
#     print(i.xpath('./text()'))

案例

# https://xiaohua.zol.com.cn/lengxiaohua/
# 需求 爬取标题和正文
from lxml import etree
from fake_useragent import UserAgent
import requests

def download(url):
    headers = {
        'user-agent': UserAgent().random
    }
    html = requests.get(url=url,headers=headers)
    return html.text

def get_dat(html):
    data_list = []
    xml = etree.HTML(html)
    # titile_list = xml.xpath('//span[@class="article-title"]/a[@target="_blank"]/text()')
    # print(titile_list)
    # text_list = xml.xpath('//div[@class="summary-text"]//text()')
    # print(text_list)
    # 先取大后取小
    li_list = xml.xpath('//ul[@class="article-list"]/li')
    for li in li_list:
        title = li.xpath('.//span[@class="article-title"]/a[@target="_blank"]/text()')
        # strip() 去除字符串头尾的空格 \n
        # text = li.xpath('.//div[@class="summary-text"]//text()')
        # 重点 推导式运用和列表脏数据清理
        text = ''.join([i.strip() for i in li.xpath('.//div[@class="summary-text"]//text()')])
        print(title)
        print(text)
        print('-'*100)
    return data_list

#  获取下一页的url 没有则返回空
def get_nexturl(html):
    xml = etree.HTML(html)
    next_url = xml.xpath("//a[text()='下一页']/@href")
    if next_url:
        return 'https://xiaohua.zol.com.cn/'+next_url[0]
    else:
        return None



if __name__ == '__main__':
    url = 'https://xiaohua.zol.com.cn/lengxiaohua/'
    i = 0
    while True:
        html = download(url)
        get_dat(html)
        url = get_nexturl(html)
        i += 1
        print(i)
        if not url:
            break

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依恋、阳光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值