Python爬虫学习五:常用-xpath

  • Post author:
  • Post category:python


背景:xpath解析:最常用且最便捷高效的一种解析方式。通用性最高。



一、xpath解析原理

  • 1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
  • 2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。



二、环境的安装


pip install lxml



三、如何实例化一个etree对象



第一步:引入对象


from lxml import etree



第二步:加载对象



方法一:将本地的html文档中的源码数据加载到etree对象中


etree.parse(filePath)



方法二:将从互联网上获取的源码数据加载到该对象中

etree.HTML('page_text')



第三步:使用etree


xpath('xpath表达式')



四、表达式说明

https://blog.csdn.net/xiaobai729/article/details/124079260

  • /:表示的是从根节点开始定位。表示的是一个层级。
  • //:表示的是多个层级。可以表示从任意位置开始定位。
  • 属性定位:

    //div[@class='song'] tag[@attrName="attrValue"]
  • 索引定位:

    //div[@class="song"]/p[3]

    索引是从1开始的。
  • 取文本:


    • /text()

      获取的是标签中直系的文本内容

    • //text()

      标签中非直系的文本内容(所有的文本内容)
  • 取属性:

    /@attrName ==>img/src

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
from lxml import etree
if __name__ == "__main__":
    #实例化好了一个etree对象,且将被解析的源码加载到了该对象中
    tree = etree.parse('test.html')
    # r = tree.xpath('/html/body/div') #获取html下面的body下面的div
    # r = tree.xpath('/html//div')#获取html下面的多个层级的div
    # r = tree.xpath('//div')#获取多个层级的div
    # r = tree.xpath('//div[@class="song"]')#获取多个层级的div并且标签里面的class为song
    # r = tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]#获取多个层级的div并且标签里面的class为tang下面的多个层级的第五个li标签下的a标签里面的内容
    # r = tree.xpath('//li[7]//text()')#多个层级的第七个li下的所有内容
    # r = tree.xpath('//div[@class="tang"]//text()')#多个层级的div标签下的class为tang下的所有内容
    r = tree.xpath('//div[@class="song"]/img/@src')#多个层级的div标签下的class为song下的img属性的内容
    print(r)



五、实战

爬取强国内容

import requests
from lxml import etree

if __name__ == '__main__':
    content = input("请输入内容:")
    # step_1:指定url
    url = 'http://www.syiban.com/search/index/init.html?modelid=1&q=' + content
    # step_2:发起请求
    # get方法会返回一个响应对象
    response = requests.get(url=url)
    # step_3:获取响应数据.text返回的是字符串形式的响应数据
    page_text = response.text
    tree = etree.HTML(page_text)
    question = tree.xpath('//span[@class="title_color"]')
    answer = tree.xpath('//div[@class="yzm-news-right"]/p/span')
    print(question)
    for index, value in enumerate(question):
        print(question[index].xpath('string()'))
        print(answer[index].xpath('string()'))
    # step_4:持久化存储
    with open('./强国.html', 'w', encoding='utf-8') as fp:
        fp.write(page_text)
    print('爬取数据结束!!!')