爬虫02
二. 解析库的使用
1. XPath
1.1 常用规则
-
更多的详见官网或者书籍,这里只列出常用的
属性定位: #找到class属性值为song的div标签 //div[@class="song"] 层级&索引定位: #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a //div[@class="tang"]/ul/li[2]/a 逻辑运算: #找到href属性值为空且class属性值为du的a标签 //a[@href="" and @class="du"] 模糊匹配: //div[contains(@class, "ng")] //div[starts-with(@class, "ta")] 取文本: # /表示获取某个标签下的文本内容 # //表示获取某个标签下的文本内容和所有子标签下的文本内容 //div[@class="song"]/p[1]/text() //div[@class="tang"]//text() 取属性: //div[@class="tang"]//li[2]/a/@href
1.2 基本使用
1.2.1 HTML
该类是传一个HTML格式的字符串数据
-
补全代码
import requests # 1. 从lxml导入etree模块 from lxml import etree text_html = '<div><h1>Hello world</h1>' # 2.实例化etree中HTML,传入一个字符串类型的数据 html = etree.HTML(text_html) # 3.tostring可以用于补全代码,但结果为bytes类型 result = etree.tostring(html) print(result) b'<html><body><div><h1>Hello world</h1></div></body></html>' -
爬取城市名称
import requests from lxml import etree url = "https://www.aqistudy.cn/historydata/" headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" } # 获取页面的源代码 page_text = requests.get(url=url,headers=headers).text # 实例化一个对象,将源代码传入 tree = etree.HTML(page_text) # li_list = tree.xpath('//div[@class="hot"]//ul/li | //div[@class="all"]//ul') # 或| 运算符 # 热门城市名称: # li_list = tree.xpath('//div[@class="hot"]//ul/li/a/text()') # ['北京', '上海', '广州', '深圳', '杭州', '天津', '成都', '南京', '西安', '武汉'] # 全部城市名称: li_list = tree.xpath('//div[@class="all"]//ul//li/a/text()') print(li_list)
1.2.2 parse
该类是传入一个html文件,如果使用etree.HTMLParser()就会在文件中加入一个DOCTYPE的声明
-
测试
import requests from lxml import etree headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" } html = etree.parse("./test.html", etree.HTMLParser()) result = etree.tostring(html) print(result) test.html
<div><h1>Hello world</h1></div>
2.Beautiful Soup
- 如果需要细看,可以看书或者百度....
2.1 常用规则
使用流程: - 导包:from bs4 import BeautifulSoup - 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容 (1)转化本地文件: - soup = BeautifulSoup(open('本地文件'), 'lxml') (2)转化网络文件: - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml') (3)打印soup对象显示内容为html文件中的内容 基础巩固: (1)根据标签名查找 - soup.a 只能找到第一个符合要求的标签 (2)获取属性 - soup.a.attrs 获取a所有的属性和属性值,返回一个字典 - soup.a.attrs['href'] 获取href属性 - soup.a['href'] 也可简写为这种形式 (3)获取内容 - soup.a.string - soup.a.text - soup.a.get_text() 【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容 (4)find:找到第一个符合要求的标签 - soup.find('a') 找到第一个符合要求的 - soup.find('a', title="xxx") - soup.find('a', alt="xxx") - soup.find('a', class_="xxx") - soup.find('a', id="xxx") (5)find_all:找到所有符合要求的标签 - soup.find_all('a') - soup.find_all(['a','b']) 找到所有的a和b标签 - soup.find_all('a', limit=2) 限制前两个 (6)根据选择器选择指定的内容 select:soup.select('#feng') - 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器 - 层级选择器: div .dudu #lala .meme .xixi 下面好多级 div > p > a > .lala 只能是下面一级 【注意】select选择器返回永远是列表,需要通过下标提取指定的对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix