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

Posted roc-atlantis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫的两种解析方式 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下面所有直接子节点book
 2     //book                    选取所有book
 3     /bookstore//book          查找bookstore下面所有的book
 4     /bookstore/book[1]        bookstore里面的第一个book
 5     /bookstore/book[last()]   bookstore里面的最后一个book
 6     /bookstore/book[position()<3]  前两个book
 7     //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           contains
21                 //input[contains(@class, "s_i")]
22                 所有的input,有class属性,并且属性中带有s_i的节点
23                 //input[contains(text(), "")]
24             starts-with
25                 //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 import etree
 2 import requests
 3 
 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).text
 9 #使用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 in ele_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 import BeautifulSoup
 2         - 使用方式:可以将一个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.string
16         - soup.a.text
17         - 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 import requests
 4 from bs4 import BeautifulSoup
 5 
 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 def parse_content(url):
10     #获取标题正文页数据
11     page_text = requests.get(url,headers=headers).text
12     soup = BeautifulSoup(page_text,lxml)
13     #解析获得标签
14     ele = soup.find(div,class_=chapter_content)
15     content = ele.text #获取标签中的数据值
16     return content
17 
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.text
22 
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 in a_eles:
30          print(开始下载第%d章节%cap)
31          cap+=1
32          title = ele.string
33          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+




)
38              print(结束下载第%d章节%cap)

 

以上是关于爬虫的两种解析方式 xpath和bs4的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫数据解析之bs4解析和xpath解析

爬虫-数据解析-bs4

关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup

全网最全python爬虫系统进阶学习(附原代码)学完可就业

全网最全python爬虫系统进阶学习(附原代码)学完可就业

《爬虫学习》(使用lxml,bs4库以及正则表达式解析数据)