Python爬虫新手村上手指南⑤

388 阅读3分钟

XPath解析数据

XPath简介

全称:XML Path Language是一种小型的查询语言

是一门在XML文档中查找信息的语言

XPath的优点

可在XML中查找信息

支持HTML的查找

可通过元素和属性进行导航

XPath需要依赖lxml库

安装方式:

pip install lxml

爬取起点小说网使用XPath数据

www.qidian.com/rank/yuepia…

import requests
from lxml import etree
url = 'https://www.qidian.com/rank/yuepiao'
#添加headers伪装成浏览器
headers= {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'}
#发送请求
resp = requests.get(url,headers)
#类型转换
e = etree.HTML(resp.text)
print(type(e))
names = e.xpath('//div[@class="book-mid-info"]/h2/a/text()')
print(names)
authors = e.xpath('//p[@class="author"]/a[1]/text()')
print(authors)

for name, author in zip(names, authors):
    print(name,":",author)

输入结果:

<class 'lxml.etree._Element'>
['夜的命名术', '明克街13号', '不科学御兽', '视死如归魏君子', '我只想安静的做个苟道中人', '公子别秀', '星门', '灵境行者', '洪主', '家父汉高祖', '赤心巡天', '这个明星很想退休', '镜面管理局', '这游戏也太真实了', '轮回乐园', '我已不做大佬好多年', '择日飞升', '长夜余火', '终宋', '深空彼岸']
['会说话的肘子', '纯洁滴小龙', '轻泉流响', '平层', '爆炸小拿铁', '荣小荣', '老鹰吃小鸡', '卖报小郎君', '烽仙', '历史系之狼', '情何以甚', '幼儿园一把手', '横扫天涯', '晨星LL', '那一只蚊子', '萌俊', '宅猪', '爱潜水的乌贼', '怪诞的表哥', '辰东']
夜的命名术 : 会说话的肘子
明克街13号 : 纯洁滴小龙
不科学御兽 : 轻泉流响
视死如归魏君子 : 平层
我只想安静的做个苟道中人 : 爆炸小拿铁
公子别秀 : 荣小荣
星门 : 老鹰吃小鸡
灵境行者 : 卖报小郎君
洪主 : 烽仙
家父汉高祖 : 历史系之狼
赤心巡天 : 情何以甚
这个明星很想退休 : 幼儿园一把手
镜面管理局 : 横扫天涯
这游戏也太真实了 : 晨星LL
轮回乐园 : 那一只蚊子
我已不做大佬好多年 : 萌俊
择日飞升 : 宅猪
长夜余火 : 爱潜水的乌贼
终宋 : 怪诞的表哥
深空彼岸 : 辰东

BeautifulSoup的简介

BeautifulSoup(直译:美味的汤)

是一个可以从HTML或XML文件中提取数据的Python库。

其功能简单而强大,容错能力高,文档相对完善,清晰易懂。

非Python标准模块,需要安装才能使用。

安装方式

pip install bs4

测试方式

import bs4

BeautifulSoup 解析数据

解析器

BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,

如果不安装第三方解析器,则Python会使用默认解析器。

示例

from bs4 import BeautifulSoup

html =  '''
    <html>
        <head>
            <title>mila</title>
        </head>
        <body>
            <h1 class="mila-body nice-body">you make me so happy</h1>
            <a href="https://www.bilibili.com/">哔哩哔哩</a>
            <h2><!--注释--></h2>
        </body>
        
    </html>
'''
# bs = BeautifulSoup(html, 'html.parser')
bs = BeautifulSoup(html, 'lxml')
#获取标签
print(bs.title)
#获取h1标签的所有属性
print(bs.h1.attrs)
#获取单个属性
print(bs.h1.get('class'))
print(bs.h1['class'])
print(bs.a['href'])
#获取文本内容
print(bs.title.text)
print(bs.title.string)
#获取内容
print('------------',bs.h2.string)#获取到h2标签中的注释的文本内容
print(bs.h2.text)#因为h2标签中没有正儿八经的文本内容

BeautifulSoup的使用

BeautifulSoup提取数据的常用方法

find() 提取满足要求的首个数据

find_all() 提取满足要求的所有数据

CSS选择器

通过ID查找 bs.select('#abc')

通过class查找 bs.select('.abc')

通过属性查找 bs.select(a['class="abc"'])

Tag对象

获取标签 bs.title

获取所有属性 bs.title.attrs

获取单个属性的值

bs.div.get('class')

bs.div['class']

bs.a['href']

from bs4 import BeautifulSoup
html = '''
    <title>malena</title>
    <div class="info" float="left">good girl gone bad</div>
    <div class="info" float="right" id="p">
        <span>come on baby</span>
        <span>you are so goo to me</span>
        <a href="https://www.bilibili.com/"></a>
    </div>
'''
bs = BeautifulSoup(html, 'lxml');
print((bs.title, type(bs.title)))
print(bs.find('div', class_='info'))
print('-------------')
print(bs.find_all('div', class_='info'))
for item in bs.find_all('div', class_='info'):
    print('*****************')
    print(item, type(item))
print('-------------')
print(bs.find_all('div',attrs={'float': 'right'}))

print('============CSS选择器==========')
print(bs.select('#p'))
print('-------------')
print(bs.select('.info'))
print('-------------')
print(bs.select('div>span'))
print('-------------')
print(bs.select('div.info>span'))
print('-------------')
for item in bs.select('div.info>span'):
    print(item.text)