requests + xpath抓取网站内容

60 篇文章 57 订阅

1.Requests

第三方的python HTTP库,其口号是“让HTTP服务人类(HTTP for Humans)”,功能丰富,接口简洁优雅,文档也很完备。支持python 2.6-3.5

安装

通过 pip 安装:

pip install requests

示例:

获取某个网页

import requests

r = requests.get('http://www.baidu.com')

传递URL参数

读取服务器响应的内容

访问 r.text 时,Requests 会基于 HTTP 头部对响应的编码作出推测,大多数时候都能自动无缝解码。你可以查看它使用了什么编码,并通过 r.encoding 属性来改变它:

2.HTML

HTML 指的是超文本标记语言(Hyper Text Markup Language),是用来描述网页的一种语言,它使用一套标记标签(markup tag)来描述网页。

  • HTML 文档描述网页
  • HTML 文档包含 HTML 标签和纯文本
  • HTML 文档也被称为网页

Web 浏览器的作用是读取 HTML 文档,并以网页的形式显示出它们。浏览器不会显示 HTML 标签,而是使用标签来解释页面的内容。

示例

<html>
<body>
    <h1>这是标题</h1>
    <p>
        这是一段话
        <a href="http://www.crossincode.com">这是链接</a>
        <img src="图片地址.jpg" width="104" height="142" />
    </p>
</body>
</html>
  • <html> 与 </html> 之间的文本描述网页
  • <body> 与 </body> 之间的文本是可见的页面内容
  • <h1> 与 </h1> 之间的文本被显示为标题
  • <p> 与 </p> 之间的文本被显示为段落
  • <a> 标签显示为一个超链接
  • <img> 标签显示为一张图片

3.XPath

XPath 即为 XML 路径语言,它是一种用来确定 XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath 基于 XML 的树状结构,提供在数据结构树中找寻节点的能力。

由于 HTML 页面也是 XML 文档的一种,所以同样适用 Xpath。

基本语法规则

XPath 通过"路径表达式"(Path Expression)来选择节点。在形式上,"路径表达式"与传统的文件系统非常类似。

  • 斜杠(/)作为路径内部的分割符。
  • 同一个节点有绝对路径和相对路径两种写法。
  • 绝对路径(absolute path)必须用"/"起首,后面紧跟根节点,比如/step/step/...。
  • 相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用"/"起首。

常用路径表达式:

  • nodename(节点名称):表示选择该节点的所有子节点
  • "/":表示选择根节点
  • "//":表示选择任意位置的某个节点
  • "."表示当前节点。
  • ".."表示当前节点的父节点
  • "@": 表示选择某个属性

示例

用以下 XML 文档为例:

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

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

常见表达式及结果

路径表达式结果
bookstore选取 bookstore 元素的所有子节点。
/bookstore选取根元素 bookstore。假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。

高级规则

路径表达式结果
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book/price/text()选取属于 bookstore 子元素的 book 元素的 price 节点中的所有文本。
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/*选取 bookstore 元素的所有子元素。
//title[@*]选取所有带有属性的 title 元素。
/bookstore/book/title | //price

选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

 

4.lxml

lxml 是一个支持 Xpath 语法的 Python 解析库。该库常用的 XML 处理功能都在 lxml.etree 中。

安装

通过 pip 安装(推荐):

pip install lxml

 

常用方法

解析 HTML 文档,接受的参数为字符串,返回值为 Element 对象:

使用tag属性,获取节点的名称:

使用 tostring 方法输出节点内容,参数为 Element 对象:

通过 XPath 方式访问文本内容:

5.调试代码

当程序没有按照预期运行时,需通过调试(debug)来修正程序。常用的方法是:

  1. 在程序中增加输出。开发过程中应多使用 print 语句,以便了解程序的运行路径和变量的值。
  2. 使用断点调试。断点(break point)是指在代码中指定位置,当程序运行到此位置时变中断下来,并让开发者可查看此时各变量的值。因断点中断的程序并没有结束,可以选择继续执行。绝大多数 IDE 都支持断点调试。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值