那些年用xpath玩爬虫时遇到的坑

那些年用xpath玩爬虫时遇到的坑,第1张

到目前为止我一直用的xpath方式爬取页面数据。

我所采取的方法是直接利用xpath爬取其中一条,判断是否能采取这种方法。

目前遇到的坑有,总结一下

解决方法是,从新分析xpath路径。绕过这个根节点,从下一级找一个新的根节点

在爬取多个页面的时候我们需要从URL中找到规律,再利用遍历达到多个页面爬取的目的。例如

之前我们在学习GET传递参数的时候,知道URl+?+参数1&参数2+&参数n传递参数。这里我们通过对比两页的URL,把多余的传参删除,留下非常简练的链接,当然必须包括keyword,和分页如file= 1等

对上面的URL简化

keyword:PHP,分页curPage = 1,对分页keyword,进行遍历拼接。达到了多页爬取的目的

由于网页结构问题,网页中回家如&ndsp的空格字符,你爬取的数据会左右开弓,非常凌乱。整体美观受到影响。解决方法是strip()函数"itemnamestrip()"

当时是爬取51job,取到的前三个字段为空,在插入excel时会出现三个空字段,分析发现是div标签,第一个字段是div[4]。当时想的办法是从divp[4]开始取值。失败,最后解决方法是还是利用strip函数判断字段是否为空,不为空取出数据插入list。

从开始接触,我们习惯了默认的UTF-8编码。在突然遇到不同的编码方式如'gbk',你爬取的字段就是一堆乱码

这个是我,一直跑火车,跑习惯了。红灯乱闯。

我没有加headers,也就是当前网页的绿灯。这个是真的没有想到,之前一直是以为headers 是模仿浏览器才去用。所以往往第一步就把我挡在了外面。

所以在爬取不管哪个网站你最好是加上headers,遵守交通规则。才能爬到你想要的数据

吃亏是福啊,在python的路上多吃点亏没错

最近遇到这样一个需求:当用户输入一个词语时,返回这个词语的解释

我的第一个想法是做一个数据库,把常用的词语和词语的解释放到数据库里面,当用户查询时直接读取数据库结果

但是自己又没有心思做这样一个数据库,于是就想到了百度百科这么一个现成的 “数据库”

下面我们就通过 urllib 和 xpath 来获取百度百科的内容

1、爬取百度百科

百度百科是一个静态网页,爬取起来很简单,而且请求参数可以直接放在 URL 里面,例如:

可以说是十分方便,也不多说,直接放代码,有不明白的地方可以看看注释:

如果对于 urllib 的使用不太清楚,可以参考 爬虫系列(三) urllib的基本使用

如果对于 xpath 的使用不太清楚,可以参考 爬虫系列(九) xpath的基本使用

import urllibrequest

import urllibparse

from lxml import etree

def query(content):

# 请求地址

url = '>

1 XPath是什么

XPath是一门在XML文档中查找信息的语言。XPath可用来在XML文档中对元素和属性进行遍历。

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

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

2 Xml示例 可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。

在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML10规范,使用它来简化Internet的文档信息传输。

示例:

<?xml version="10" encoding ="ISO-8859-1">

<book>

<title lang="en">Harry Potter</title>

<author>J K Rowling</author>

<year>2005</year>

<price>2999</price>

</book>

1、Xpath也可以使用元素的属性值来定位,以百度输入框和搜索按钮为例

2、通过id属性值来定位:注释://表示在当前页面的某个目录下,input表示定位元素的标签名,[@id='kw'],表示这个元素的id属性值等于kw

3、通过name和class属性值来定位:如果不想指定标签名,则也可以用代替,当然,使用Xpath不局限于id,name和class这三个属性值,元素的任意属性值都可以使用,只要它是唯一的标识元素

4、层级与属性结合。如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以找到其上一级元素,如果它的上一级有唯一可以标识属性的值,也可以拿来使用

5、使用逻辑运算符。如果一个属性不能唯一地区分一个元素,我们还可以使用逻辑运算符连接多个属性来查找元素。例如,假如要查找第一行元素,则:

本文主要围绕以xpath和lxml库进行展开:

一、xpath 概念、xpath节点、xpath语法、xpath轴、xpath运算符

二、lxml的安装、lxml的使用、lxml案例

一、xpath

1xpath概念

XPath 是一门在 XML 文档中查找信息的语言。XPath 使用路径表达式在 XML 文档中进行导航 。XPath 包含一个标准函数库 。XPath 是 XSLT 中的主要元素 。XPath 是一个 W3C 标准 。

2xpath节点

xpath有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。

节点关系:父、子、兄弟、先辈、后辈。

3xpath语法

xpath语法在W3c网站上有详细的介绍,这里截取部分知识,供大家学习。

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。下面列出了最有用的路径表达式:

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

XPath 通配符可用来选取未知的 XML 元素。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

通过在路径表达式中使用"|"运算符,您可以选取若干个路径。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

4xpath 轴

轴可定义相对于当前节点的节点集。

5xpath运算符

下面列出了可用在 XPath 表达式中的运算符:

好了,xpath的内容就这么多了。接下来我们要介绍一个神器lxml,他的速度很快,曾经一直是我使用beautifulsoup时最钟爱的解析器,没有之一,因为他的速度的确比其他的htmlparser 和html5lib快了许多。

二、lxml

1lxml安装

lxml 是一个xpath格式解析模块,安装很方便,直接pip install lxml 或者easy_install lxml即可。

2lxml 使用

lxml提供了两种解析网页的方式,一种是你解析自己写的离线网页时,另一种 则是解析线上网页。

导入包:

1解析离线网页:

2解析在线网页:

那么我们怎么获取这些标签和标签对应的属性值了,很简单,首先获取标签只需你这样做:

然后我们可以,比方说,你要获取a标签内的文本和它的属性href所对应的值,有两种方法,

1表达式内获取

2表达式外获取

这样就完成了获取,怎么样,是不是很简单了,哈哈哈。

下面再来lxml的解析规则:

3lxml案例

为了偷懒,我决定还是采用urllib那篇文章的代码,哈哈哈,机智如我。

以上就是关于那些年用xpath玩爬虫时遇到的坑全部的内容,包括:那些年用xpath玩爬虫时遇到的坑、xhr如何获取百度百科的内容、什么是Xpath及其用法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9347934.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存