Day04笔记
1. Xpath工具(解析)
1. xpath
在XML文档中查找信息的语言,同样适用于HTML文档检索
2. xpath辅助工具
1. chrome插件 :xpath-helper
1. 打开/关闭 :ctrl+shift+x
2. Firefox插件: Xpath checker
3. Xpath表达式编辑工具 :XML Quire
3.xpath 匹配规则
1.匹配演示
1. 匹配bookstore下面的所有节点: /bookstore
2. 查询所有的book节点: //book
3. 查找/bookstore下的book节点 : /bookstore /book
4. 查找所有book节点下的title节点中,lang属性为"en"的节点 //book/title[@lang="en"]
5. 查找bookstore下的第2个book节点下的title节点 /bookstore/book[2]/title
6. 获取bookstore下的第2个book节点下的title节点的内容 /bookstore/book[2]/title/text()
2. 选取节点
/ : 从根节点开始选取
// : 从整个文档中查找节点
// price、/bookstore/book//price
@: 选取某个节点的属性值
// div[@class='movie-info']/a[@class="name"]
@: 获取某个节点的属性值
例:获取所有的booK节点下title节点的lang属性值
//book/title/@lang
3. 匹配多路径
1. 符号:|
2. 获取所有book节点下的title节点和priceJiedian
//book/title | //book/price
4. 函数
1. contains()
匹配1 个属性值中包含某个字符串的节点
// title[contains(@lang,'ch')]
2. text()
//title[contains(@lang,'ch')]/text()
2. lxml库及xpath的使用
1. lxml库: HTML/XML解析库
1. Anachonda : conda install lxml
2. Windows cmd : python -m pip install lxml
2. 使用流程
1. 导入模块: from lxml import etree
2. 创建解析对象: parseHtml = etree.HTML(html)
3. 调用xpath :
r_list = parseHtml.xpath('xpath表达式')
4. 如何获取节点对象的文本内容
节点对象名.text
3. 抓取百度贴吧中所有帖子例的图片
1. 指定贴吧的所有图片
2. 思路:
1. 先获取贴吧主页URL,下一页: 找url规律
2. 获取1页中每个帖子的url ['链接1','','','']
3. for 循环遍历2中列表,发请求,提取帖子中图片链接
['图片链接1,','图片链接2'....]
4. for 循环遍历3中列表,发请求,以wb方式保存本地
3. 步骤
1. 获取贴吧主页url
http://tieba.com/f?+ 查询参数
2.(xpath)提取页面中所有帖子的url
src :完整的链接
href : 需要和主url进行拼接
http://tieba.baidu.com + /p/5020551987
校花吧:
self.url_xpath = "//div/div/a[@class='j_th_tit ']/@href"
3. 匹配一个帖子中所有图片的url
校花吧:
self.img_xpath = "//div/cc/div/img[@class='BDE_Image']/@src"
for 每个帖子的连接 in [帖子连接列表]:
res = get(每个帖子链接)
html = res.text
图片链接列表 = xpath('')
for 每个图片连接 in [图片连接列表]:
res =get(每个图片的连接)
html = res.content
5.注意:
1. xpath表达式在网页中可匹配但在程序中是空列表
1. User-Agent :最好换为IE浏览器
2. 把页面下载下来 再分析
6.案例 :糗事百科-xpath
1. 目标:用户昵称,段子内容,好笑数量,评论数量
2. 步骤
1. 找url
第一页: https://www.qiushibaike.com/
第二页:https://www.qiushibaike.com/8hr/page/2/
第三页: https://www.qiushibaike.com/8hr/page/3/
2. xpath表达式
1. 基准的xpath 表达式(每个段子的节点对象)
//div[contains(@id,"qiushi_tag_")]
2. for element in [段子节点对象列表]:
用户昵称: './div/a/h2'
段子内容: './/div[@class="content"]/span'
好笑数量: './/i'
评论数量: './/i'