爬虫的两种解析方式 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+‘\n\n\n\n\n‘)
38              print(‘结束下载第%d章节‘%cap)

原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9714457.html

时间: 2024-10-07 07:02:16

爬虫的两种解析方式 xpath和bs4的相关文章

xml的两种解析方式

xml解析是日常项目中用到比較多的技能.不管是配置參数或者数据都能够保存在xml文件里.同一时候也能够将xml作为数据传输的一种格式.本文将介绍两种基本解析方式:xml字符串解析和xml文件解析. xml字符串解析 package com.discover.parse; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Documen

【网络爬虫的三种解析方式】 -- 2019-08-08 18:01:21

原文: http://106.13.73.98/__/132/ 三种解析方式 正则解析 Xpath解析 BeautifulSoup解析 本文将详细为大家讲解三种聚焦爬虫中的数据解析方式. requests模块可实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 ???????其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析.因为,在大多数情况下,我们都是指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是

Json两种解析方式

JSON数据解析的有点在于他的体积小,在网络上传输的时候可以更省流量,所以使用越来越广泛,下面介绍使用JsonObject和JsonArray的两种方式解析Json数据. 使用以上两种方式解析json均需要依赖json-lib.jar开发包使用依赖包 1.JsonObject 使用JsonObject解析只有一条数据的json是非常方便的例如:"{\"name\":\"zhangsan\",\"password\":\"zha

XML的两种解析方式逐行解析(SAX解析)节点解析(DOM解析);

SAX逐行解析 SAX:SimpleAPIfor XML.基于事件驱动的解析方式,逐行解析数据.(采用协议回调机制) NSXMLParser是iOS自带的XML解析类.采用SAX方式解析数据 解析过程由NSXMLParserDelegate协议方法回调 解析过程:开始标签->取值->结束标签->取值 DOM解析 DOM:DocumentObjectModel(文档对象模型).解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据 GDataXMLNod

XML的两种解析方式,Dom4j and SAX parse

Dom4j and Sax difference. Dom4j 解析的速度慢,而且消耗内存,因为在解析之前要先把文件放到内存中.并采用基于对象的模型解析 有以下几点: 1. Dom4J parse loads the entire XML file into memory before parsing. 2. It uses Object based Model for parsing XML. 3. High memory usage - as it loads the file to mem

xml中俩种解析方式

两种解析方式 1.from xml.etree import ElementTree as ET 利用ElementTree模块下的xml方法可以把一个字符串类型的东西转换成Element类,从而利用Element类下面的方法 xml(字符串)解析方式只能读不能写 from xml.etree import ElementTree as ET # 打开文件,读取XML内容 str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xm

Unity3d Android SDK接入解析(二)Unity3d Android SDK的设计与两种接入方式

一.前言 上篇说清楚了Unity和Android调用的方式,但很多实际接入的部分没有讲的很详细,因为重头在这篇,会详细讲述具体接入Android SDK的方式,和怎么去做一个方便Unity接入的SDK. 传送门: 前篇:Unity3d 与 Android之间的互相调用 http://blog.csdn.net/yang8456211/article/details/51331358 后篇:Unity3d Android SDK接入解析(三)接入Android Library的理解 http://

Redis两种持久化方式(RDB&amp;AOF)

爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Redis并发锁 windows下redis基础操作与主从复制 从而 数据备份和读写分离 Redis两种持久化方式(RDB&AOF) Redis的持久化过程中并不需要我们开发人员过多的参与,我们要做的是什么呢?除了深入了解RDB和AOF的作用原理,剩下的就是根据实际情况来制定合适的策略了,再复杂一点,也就

ListView+CheckBox两种解决方式及原因分析

近期在用ListView+CheckBox搞一个item选中的项目,我将CheckBox的focus设置为false,另我大喜的是,CheckBox居然能够选中(窃喜中),这么简单就搞定了,由于数据量较小,也没有发现什么问题. 后来数据多了. 页面须要滑动了, 发现了一个奇怪的问题,前面明明选中了,而再次滑动回去的时候居然变成未选中状态! 这是我刚開始写的那段错误的代码: @Override public View getView(int position, View convertView,