使用Xpath解析豆瓣短评

Python爬虫(入门+进阶)     DC学院

本节课程主要介绍解析神器Xpath是什么、Xpath如何安装及使用,以及使用实际的例子讲解Xpath如何解析豆瓣短评的网页并获取数据。

  • 解析神器Xpath
  • Xpath的使用
  • 实战环节

解析神器Xpath:

1. 什么是Xpath

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。

可以阅读该文档了解更多关于Xpath的知识。

2. Xpath解析网页的流程

  • 首先通过Requests库获取网页数据
  • 通过网页解析,得到想要的数据或者新的链接
  • 网页解析可以通过Xpath或者其它解析工具进行,Xpath在是一个非常好用的网页解析工具 

3. 常用的网页解析 

  • 正则表达式使用比较困难,学习成本较高
  • BeautifulSoup性能较慢,相对于Xpath较难,在某些特定场景下有用
  • Xpath使用简单,速度快(Xpath是lxml里面的一种),是抓取数据最好的选择

4. Xpath的安装

  • 第一种方法:直接使用pip安装,直接在命令行输入以下代码
pip install lxml
  • 第二种方法:使用下载whl文件方法安装(安装方法跟上节课安装Requests库方法相同),这种方法在直接使用pip安装不成功的情况下采用 
    1. 第一步前往http://www.lfd.uci.edu/~gohlke/pythonlibs/,手动下载需要安装的第三方包(注意对应你的python版本是32位还是64位)
    2. 然后在下载下来的文件所在目录按住shift并点击鼠标右键,选择在此处打开Powershell窗口,在此命令行中使用“pip install + 下载下来文件全名”,即可完成安装
  • 检查安装:进入Python,输入import lxml导入新安装的lxml,如果没有返回错误便说明已安装成功

Xpath的使用:

1. 使用Xpath解析网页数据的步骤

  • 从lxml导入etree
  • 解析数据,返回xml结构
  • 使用.xpath()寻找和定位数据
from lxml import etree
 
html ='''#省略'''#html数据,使用requests获取
 
s = etree.HTML(html)#解析html数据
 
print(s.xpath())#使用.xpath()

2. 获取Xpath的方法

  • 第一种方法:从浏览器直接复制
  • 首先在浏览器上定位到需要爬取的数据
  • 右键,点击“检查”,在“Elements”下找到定位到所需数据
  • 右键——Copy——Copy Xpath,即可完成Xpath的复制
  • 示例:

#从浏览器直接复制Xpath
import requests
from lxml import etree
 
url = 'https://book.douban.com/subject/1084336/comments/'
r = requests.get(url).text
 
s = etree.HTML(r)
print(s.xpath('//*[@id=“comments”]/ul/li[1]/div[2]/p/text()'))
  • 第二种方法:手写Xpath
  • 获取文本内容用 text()
  • 获取注释用 comment()
  • 获取其它任何属性用@xx,如: 
    href 
    src 
    value
  • 想要获取某个标签下所有的文本(包括子标签下的文本),使用string 
    如”< p>123< a>来获取我啊< /a>< /p>”,这边如果想要得到的文本为”123来获取我啊”,则需要使用string
  • starts-with 匹配字符串前面相等
  • contains 匹配任何位置相等
  • 示例:

#手写Xpath
import requests
from lxml import etree
 
url = 'https://book.douban.com/subject/1084336/comments/'
r = requests.get(url).text
 
s = etree.HTML(r)
print(s.xpath('//div[@class="comment"]/p/text()')[0])

实战环节

使用Xpath爬取豆瓣图书《小王子》短评网页

  • 使用从浏览器复制Xpath的方法获取同一网页下不同短评的Xpath,通过对比发现其规律
  • 对比从浏览器复制Xpath的方法跟手写Xpath的方法的不同点已经两种方法各自的应用场景
import requests
from lxml import etree
 
url = 'https://book.douban.com/subject/1084336/comments/'
r = requests.get(url).text
 
s = etree.HTML(r)
#从浏览器复制第一条评论的Xpath
print(s.xpath('//*[@id="comments"]/ul/li[1]/div[2]/p/text()'))
#从浏览器复制第二条评论的Xpath
print(s.xpath('//*[@id="comments"]/ul/li[2]/div[2]/p/text()'))
#从浏览器复制第三条评论的Xpath
print(s.xpath('//*[@id=“comments”]/ul/li[3]/div[2]/p/text()'))
 
#掌握规律,删除li[]的括号,获取全部短评
print(s.xpath('//*[@id=“comments”]/ul/li/div[2]/p/text()'))
 
#手写Xpath获取全部短评
print(s.xpath('//div[@class="comment"]/p/text()'))
  • 通过对比可以发现从浏览器复制的Xpath中,“li[]”括号中的数字代表对应的第几条评论,直接删除括号,即可获取全部短评
  • 对于结构清晰的html网页,可以直接手写Xpath,更加简洁且高效
  • 对于结构复杂的html网页,可以通过浏览器复制的方式获取Xpath

课后作业

1. 安装lxml 
2. 使用Xpath解析豆瓣网页 
3. 勇敢尝试你想爬取的网站

A. 爬取知乎“Python”话题精华数据

import requests
url = 'https://www.zhihu.com/topic/19552832/top-answers'
r = requests.get(url).text
print(r)
  • 尝试着使用前面所学习的方法获取知乎“Python”话题精华的网页并打印出来,看看会出现什么问题
  • 由于知乎反爬虫的原因,以上代码会返回“500 Server Error”,具体的解决方法会在第六课学习到

B. 爬取小猪短租(深圳)页面的数据

爬取小猪短租(深圳)页面的短租标题、价格和经纬度,如图: 

代码如下:

import requests
from lxml import etree
url = 'http://sz.xiaozhu.com/'
r = requests.get(url).text#使用requests获取数据
s = etree.HTML(r)#解析html数据
print(s.xpath('//*[@id="page_list"]/ul/li/div[2]/div/a/span/text()'))#打印短租标题
print(s.xpath('//*[@id="page_list"]/ul/li/div[2]/span[1]/i/text()'))#打印短租价格
print(s.xpath('//*[@id="page_list"]/ul/li/@latlng'))#打印短租经纬度
  • 首先使用浏览器打开小猪短租(深圳) 的页面,通过阻止JavaScript加载的方法确定网页的加载方式
  • 可以发现,阻止JavaScript加载之后页面还是可以显示短租的标题、价格等数据
  • 接下来便可以爬取这一部分可显示的数据,在此例子中,我们主要爬取单个页面中每条短租信息的标题、价格和经纬度

补充知识

Xpath教程

Xpath的基本使用

正则表达式

BeautifulSoup

Python爬虫(入门+进阶)    造数科技   主讲

更多数据科学课程,上DC学院


关注DC,获取更多学习资源

@1-4使用Xpath解析豆瓣短评的更多相关文章

  1. @1-5使用pandas保存豆瓣短评数据

    使用pandas保存豆瓣短评数据 Python爬虫(入门+进阶)     DC学院 本节课程的内容是介绍open函数和pandas两种保存已爬取的数据的方法,并通过实际例子使用pandas保存数据. ...

  2. 哪吒票房超复联4,100行python代码抓取豆瓣短评,看看网友怎么说

    <哪吒之魔童降世>这部国产动画巅峰之作,上映快一个月时间,票房口碑双丰收. 迄今已有超一亿人次观看,票房达到42.39亿元,超过复联4,跻身中国票房纪录第三名,仅次于<战狼2> ...

  3. 爬虫的三种解析方式(正则解析, xpath解析, bs4解析)

    一 : 正则解析 : 常用正则回顾: 单字符: . : 除换行符以外的所有字符 [] : [aoe] [a-w] 匹配集合中任意一个字符 \d : 数字 [0-9] \D : 非数字 \w : 非数字 ...

  4. Xpath解析库的使用

    ### Xpath常用规则 ## nodename 选取此节点的所有子节点 ## / 从当前节点选取直接子节点 ## // 从当前节点选取子孙节点 ## . 选取当前节点 ## .. 选取当前节点的父 ...

  5. JAVA通过XPath解析XML性能比较(原创)

    (转载请标明原文地址) 最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种 ...

  6. 利用XPath解析带有xmlns的XML文件

    在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中 ...

  7. 爬虫系列二(数据清洗--->xpath解析数据)

    一 xpath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...

  8. python开发遇到的坑(1)xpath解析ValueError: Unicode strings with encoding declaration are not supported

    Traceback (most recent call last): File "/Users/*******.py", line 37, in <module> Bt ...

  9. xpath解析数据

    xpath解析数据 """ xpath 也是一种用于解析xml文档数据的方式 xml path w3c xpath搜索用法 在 XPath 中,有七种类型的节点:元素.属 ...

随机推荐

  1. MATLAB GUI图片添加背景

    global im [filename,pathname]=uigetfile('*.jpg','输入图片'); file=strcat(pathname,filename); im=imread(f ...

  2. Genomic signatures of evolutionary transitions from solitary to group living(独居到社会性的转变)

    1.摘要 群居性的进化是进化的主要过渡之一,但其背后的基因组变化是未知的.我们比较了10种蜜蜂的基因组,它们的社会复杂性各不相同,代表了社会进化中的多种独立过渡,并报告了三项主要发现. 第一,许多重要 ...

  3. SSM框架下,使用ajax请求上传文件(doc\docx\excel\图片等)

    1.准备工作 1.1.添加上传必要jar包 <dependency> <groupId>commons-io</groupId> <artifactId> ...

  4. jQuery写省级联动列表,创造二维数组,以及如何存/调用二维数组中的数据

    jQuery写省级联动列表,创造二维数组来存放数据,然后通过each来遍历调用,通过creatTxtNode创建文本节点,通过createElement创建标签option,在通过append将文本写 ...

  5. webpack config

    [webpack config] 1.entry Simple rule: one entry point per HTML page. SPA: one entry point, MPA: mult ...

  6. linux下mysql升级

    最近漏洞扫描,扫描出了数据库存在中高危漏洞,于是迫切需要进行数据库升级.上网查了各种资料,说法很多,也到自己虚拟机上试了好多方法,终于倒腾出来,做下小总结记录一下. 升级操作: 1.到mysql官网h ...

  7. JMeter学习(二十八)内存溢出解决方法(转载)

    转载自 http://www.cnblogs.com/yangxia-test 使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jme ...

  8. oracle 的查询问题!!!

    问题: declare aaa integer;email varchar2(100) :='1234@aa.com';begin select count(*) into aaa from dual ...

  9. ds.Tables[0].Rows.RemoveAt(i)数据库表格删除行

    不要在循环里使用myDataTable.Rows.RemoveAt(i).因为每删除一行后.i的值会增加,但行数会是减少了.这么做一定会出错.因此要遍历数据,使用Remove方式时,要倒序的遍历int ...

  10. rdlc报表的导出及预览时表头

    感谢各路大神的博客,总结rdlc报表中目前用到的知识,积累. 一.rdlc报表PDF打印出现空白页 1.先至Report.rdlc報表設計的頁面,選擇功能表上的[報表]->[報表屬性],在[配置 ...