python爬虫selenium和bs4_爬虫的两种解析方式 xpath和bs4

1.xpath解析

from lxml import etree

两种方式使用:将html文档变成一个对象,然后调用对象的方法去查找指定的节点

(1)本地文件

tree = etree.parse(文件名)  ===》保存的本地文件路径放入

(2)网络文件

tree = etree.HTML(网页字符串) ==》直接把得到的网页字符串作为参数传入

ret = tree.xpath(路径表达式)

【注】ret是一个列表,所以要用ret需要对之进行处理

参考文献:w3c xpath

- 安装xpath插件:可以在插件中直接执行xpath表达式

1.将xpath插件拖动到谷歌浏览器拓展程序(更多工具)中,安装成功

2.启动和关闭插件 ctrl + shift + x

常用的一些xpath表达式

1 /bookstore/book 选取根节点bookstore下面所有直接子节点book2 //book 选取所有book3 /bookstore//book 查找bookstore下面所有的book4 /bookstore/book[1] bookstore里面的第一个book5 /bookstore/book[last()] bookstore里面的最后一个book6 /bookstore/book[position()<3] 前两个book7 //title[@lang] 所有的带有lang属性的title节点8 //title[@lang='eng'] 所有的lang属性值为eng的title节点9 属性定位10 //li[@id="hua"]11 //div[@class="song"]12 层级定位&索引13 //div[@id="head"]/div/div[2]/a[@class="toindex"]14 【注】索引从1开始15 //div[@id="head"]//a[@class="toindex"]16 【注】双斜杠代表下面所有的a节点,不管位置17 逻辑运算18 //input[@class="s_ipt" and @name="wd"]19 模糊匹配 :20 contains21 //input[contains(@class, "s_i")]22 所有的input,有class属性,并且属性中带有s_i的节点23 //input[contains(text(), "爱")]24 starts-with25 //input[starts-with(@class, "s")]26 所有的input,有class属性,并且属性以s开头27 取文本28 //div[@id="u1"]/a[5]/text() 获取节点内容29 //div[@id="u1"]//text() 获取节点里面不带标签的所有内容30 取属性31 //div[@id="u1"]/a[5]/@href

综合练习:获取好段子中的内容和作者

1 from lxml importetree2 importrequests3

4 url='http://www.haoduanzi.com/category-10_2.html'

5 headers ={6 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',7 }8 url_content=requests.get(url,headers=headers).text9 #使用xpath对url_conten进行解析

10 #使用xpath解析从网络上获取的数据

11 tree=etree.HTML(url_content)12 #解析获取当页所有段子的标题

13 title_list=tree.xpath('//div[@class="log cate10 auth1"]/h3/a/text()')14

15 ele_div_list=tree.xpath('//div[@class="log cate10 auth1"]')16

17 text_list=[] #最终会存储12个段子的文本内容

18 for ele inele_div_list:19 #段子的文本内容(是存放在list列表中)

20 text_list=ele.xpath('./div[@class="cont"]//text()')21 #list列表中的文本内容全部提取到一个字符串中

22 text_str=str(text_list)23 #字符串形式的文本内容防止到all_text列表中

24 text_list.append(text_str)25 print(title_list)26 print(text_list)

2.bs4解析

安装:

- 需要将pip源设置为国内源,阿里源、豆瓣源、网易源等

- windows

(1)打开文件资源管理器(文件夹地址栏中)

(2)地址栏上面输入 %appdata%

(3)在这里面新建一个文件夹 pip

(4)在pip文件夹里面新建一个文件叫做 pip.ini ,内容写如下即可

[global]

timeout = 6000

index-url = https://mirrors.aliyun.com/pypi/simple/

trusted-host = mirrors.aliyun.com

- linux

(1)cd ~

(2)mkdir ~/.pip

(3)vi ~/.pip/pip.conf

(4)编辑内容,和windows一模一样

- 需要安装:pip install bs4

bs4在使用时候需要一个第三方库,把这个库也安装一下

pip install lxml

简单实用规则

1 - from bs4 importBeautifulSoup2 -使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的内容3 (1)转化本地文件:4 - soup = BeautifulSoup(open('本地文件'), 'lxml')5 (2)转化网络文件:6 - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')7 (3)打印soup对象显示内容为html文件中的内容8 (1)根据标签名查找9 -soup.a 只能找到第一个符合要求的标签10 (2)获取属性11 -soup.a.attrs 获取a所有的属性和属性值,返回一个字典12 - soup.a.attrs['href'] 获取href属性13 - soup.a['href'] 也可简写为这种形式14 (3)获取内容15 -soup.a.string16 -soup.a.text17 -soup.a.get_text()18 【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容19 (4)find:找到第一个符合要求的标签20 - soup.find('a') 找到第一个符合要求的21 - soup.find('a', title="xxx")22 - soup.find('a', alt="xxx")23 - soup.find('a', class_="xxx")24 - soup.find('a', id="xxx")25 (5)find_all:找到所有符合要求的标签26 - soup.find_all('a')27 - soup.find_all(['a','b']) 找到所有的a和b标签28 - soup.find_all('a', limit=2) 限制前两个29 (6)select:soup.select('#feng')30 -根据选择器选择指定的内容31 - 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器

32 -层级选择器:33 div .dudu #lala .meme .xixi 下面好多级

34 div > p > a >.lala 只能是下面一级35 【注意】select选择器返回永远是列表,需要通过下标提取指定的对象

- 综合练习:

需求:使用bs4实现将诗词名句网站中三国演义小说的每一章的内容爬去到本地磁盘进行存储

http://www.shicimingju.com/book/sanguoyanyi.html

1 #!/usr/bin/env python

2 #-*- coding:utf-8 -*-

3 importrequests4 from bs4 importBeautifulSoup5

6 headers={7 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',8 }9 defparse_content(url):10 #获取标题正文页数据

11 page_text = requests.get(url,headers=headers).text12 soup = BeautifulSoup(page_text,'lxml')13 #解析获得标签

14 ele = soup.find('div',class_='chapter_content')15 content = ele.text #获取标签中的数据值

16 returncontent17

18 if __name__ == "__main__":19 url = 'http://www.shicimingju.com/book/sanguoyanyi.html'

20 reponse = requests.get(url=url,headers=headers)21 page_text =reponse.text22

23 #创建soup对象

24 soup = BeautifulSoup(page_text,'lxml')25 #解析数据

26 a_eles = soup.select('.book-mulu > ul > li > a')27 print(a_eles)28 cap = 1

29 for ele ina_eles:30 print('开始下载第%d章节'%cap)31 cap+=1

32 title =ele.string33 content_url = 'http://www.shicimingju.com'+ele['href']34 content =parse_content(content_url)35

36 with open('./sanguo.txt','w') as fp:37 fp.write(title+":"+content+'\n\n\n\n\n')38 print('结束下载第%d章节'%cap)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值