xpah的使用

发布时间:2023-12-14 14:30

目录

基本介绍

基本使用

案例


基本介绍

为什么要学习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 = '''

    
        aaa
        bbb
        
            bookstore
                
                    Harry Potter
                    aaa
                    333
                    JK.Rowing
                    2005
                    29
                
        
    

'''

# 把html转化为lxml对象 
# 自动补全
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

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号