爬虫基础 --xpath和lxml(解析网页信息)

xpath

-可以提取xml和html网页中的数据的语言

xpath语法
xpath helper插件:帮助我们从”elements”中定位数据

1.选择节点(便签)
/html/head/meta :能够选中html下head下所有的meta标签

2.// :能够从任意节点开始选择
//li 表示当前所有页面中的标签
/html/head//link :head下的所有link标签

3.@符号的用途
–选择具体某个元素
//ul[@class=”toolbar”]/li :选择class=”toolbar”的ul下的li

–获取某一属性的值
a@/href:选择a的href的值

4.获取文本 text()
//div[@class=”w-header”]/span/text():获取span下的文本
5. ./xx当前节点下XX的标签

lxml

pip install lxml

基本用法:
from lxml import etree

element=etree.HTML(“html字符串或者xml文本”)—element对象
element.xpath()—可以使用xpath语法获取数据
”’

实例演示–糗事百科数据抓取

import requests
from lxml import etree
import json

#创建类
class QiubaiSpider():
    #定义构造器
    def __init__(self):
        self.url_temp="https://www.qiushibaike.com/8hr/page/{}/" #通过翻页观察规律
        self.headers={
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
        }

    #定义功能函数---得到url列表
        #利用列表推导式及format方法
        url_list =[self.url_temp.format(i) for i in range(1,14)]
        return url_list

    #定义功能函数---得到html字符串
    def get_html(self,url):
        print("正在对 %s 发出请求" % url)
        res=requests.get(url,headers=self.headers)
        return res.content.decode()

    #定义功能函数---解析html字符串
    def parse_html(self,html_str):
        #建立element对象
        html=etree.HTML(html_str)
        #分组---便于for遍历取值
        div_list=html.xpath("//div[@id='content-left']/div")
        content_list=[]
        for div in div_list:
            item = {}
            item["author_name"]=div.xpath(".//h2/text()")[0].strip() if len(div.xpath(".//h2/text()")) else None
            item["content"]=div.xpath(".//div[@class='content']/span/text()")
            item["content"]=[i.strip() for i in item["content"]]
            item["img"]=div.xpath(".//img[@class='illustration']/@src")
            #注意图片链接的完整性与三元运算符赋值操作
            item["img"]="https:"+ item["img"][0] if len(div.xpath(".//img[@class='illustration']/@src")) else None
            content_list.append(item)
        return content_list

    #定义功能函数---保存数据
    def save_content_list(self,content_list):
        with open("qiubai.txt","a",encoding="utf-8") as f:
            for content in content_list:
                #将python字典数据转为为json字符串
                f.write(json.dumps(content,ensure_ascii=False))
                f.write("\n")
            print("保存成功")

    #定义run方法---实现主要逻辑
    def run(self): 
        # 1.根据url地址规律构造url_list
        url_list=self.get_url_list()
        # 2.发送请求,获取响应
        for url in url_list:
            html_str=self.get_html(url)
        # 3.提取数据
        content_list=self.parse_html(html_str)
        # 4.保存
        self.save_content_list(content_list)

if __name__ == '__main__':
    qiubai=QiubaiSpider()
    qiubai.run()

你可能感兴趣的:(爬虫基础 --xpath和lxml(解析网页信息))