CSS 选择器与 Xpath 数据提取

  1. 1、CSS 选择器
    1. 1.1 基本选择器
      1. 举个例子
    2. 1.2 进阶选择器
      1. 伪类选择器
  2. 2. XPath 选择器
    1. 2.1 XML 介绍
    2. 2.2 xpath
      1. 2.2.1 提取规则
      2. 举个例子
  3. 3、异常处理

1、CSS 选择器

1.1 基本选择器

这里介绍标签选择器,类选择器,ID 选择器。

一段 html 网页文件,都是包含着众多标签的,如:

<html>...</html>
<p>...</p>
<span>...</span>
etc...

我们可以直接选择标签以提取标签里面的内容。

看看如何使用:

import requests
from parsel import Selector

html=requests.get(url).text
selector=Selector(html)

res=selector.css('XX')  // 指标签名。如 p,span 等,返回带标签的列表
res=selector.css('.XX')  // 指定类名。如 class="XX",style="XX",返回带类名的列表
res=selector.css('#XX')  // 指定 id 名。如 id="XX",返回带类名的列表


print(res.get())
print(res.extract())  //.get()和.extract()是一样的
print(res.getall)     // 取到 ' 标签 / 类 /id 名 ' 所有的内容

属性提取器::

selector.css('XX::text'),可提取 XX 里的文本内容。

selector.css('XX::attr(属性名称)'),可提取指定的属性内容

多层提取

selector.css('XX.YY::text'),意思是提取 XX 标签下的 YY 属性里的文本内容。

举个例子

有如下 maoyan.html 文件,需要提取里面的电影名称,演员,上映时间等信息。

from parsel import Selector
sel=Selector(html)

name=sel.css('p.name').css('a::text').getall()   
// 首先提取 p 便签,属性为 name 内容,再进一步里面提取 a 标签里的文本

star=sel.css('p.star::text').getall()   
// 首先提取 p 便签,属性为 star 内容,再提取文本

releasetime=sel.css('p.releasetime::text').getall()
// 首先提取 p 便签,属性为 releasetime 内容,再提取文本

1.2 进阶选择器

伪类选择器

: 伪类选择器,通过索引选择。

dd5=selector.css('div.main dd:nth-child(4)')   // 选择第五个标签内容
dd_last=selector.css('div.main dd:last-child') // 选择最后一个 dd 标签

更多用法:https://www.runoob.com/css/css-pseudo-classes.html

2. XPath 选择器

2.1 XML 介绍

XML 称为可扩展标记语言,XML 是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者。非常类似 HTML。

HTML 和 XML 的区别在于 HTML 主要用来显示数据,XML 是用来传输数据。

XML 都是标签闭合的。例如:<bookstore> ... </bookstore>成对出现。

  • 正则:提取文字
  • css 选择器:提取网页
  • xpath:xml 节点
<?xml version="1.0" encoding="utf-8"?>

<bookstore>

  <book category=" 奇幻 ">
    <title lang="ch"> 冰与火之歌 </title>
    <author> 乔治 马丁 </author>
    <year>2005</year>
    <price>365.00</price>
  </book>

  <book category=" 童话 ">
    <title lang="ch"> 哈利波特与死亡圣器 </title>
    <author>J K. 罗琳 </author>
    <year>2005</year>
    <price>48.98</price>
  </book>

2.2 xpath

XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML/HTML 文档中对元素和属性进行遍历,并提取相应元素。

使用 xpath 提取元素,需要有标签节点才能实现!

2.2.1 提取规则

符号 含义
// 当前节点下任意子孙节点下的内容
./ 当前节点下直接子节点的内容
.// 当前节点下任意子孙节点的内容
/ 选取直接子节点
. 当前节点
.. 当前节点的父节点
[] 中括号里指定需要选择的属性
@ 选择属性
[@class=’name’] 选择属性名为 class,且值为‘name’的内容
| 选择左右两个节点
* 替换任何标签
book[1] 选取第一个 book 元素
//li[contains(@attrib,value)] 选取任意节点下有 li 标签且包含 attrib 和 value 属性的内容
//li[text()=”xxx”] 选取任意节点下有 li 标签且其文本为 xxx 的内容
//li/text() 选取任意节点下 li 标签下的文本内容
//li/a/@href 选取任意节点下 li 标签的子标签 a 属性名为 href 对应的属性值

举个例子

批量提取:url=http://music.taihe.com/artist/2517

import requests
from parsel import Selector

response=requests.get(url,headers=headers)
response.encoding='utf-8'
html=Selector(response.text)
lis=html.xpath('//div[@class="song-list-wrap"]/ul/li') // 首先取到 li 标签,进行粗提取
print(lis)
// 输出结果
 15    // 一个页面有 15 首歌曲,故也应该有 15 个 li 标签

再分析 li 标签内的内容,进行具体信息提取:

上图截取了第一个 li 标签里的所有内容

for li in lis:
    name=li.xpath('.//span[@class="songname"]/a/text()').getall()[0].strip()
    print(name)    
// 打印歌曲名字
// 其他内容提取方式相同...

3、异常处理

css 选择器遇见含空格类提取问题:

response.css(“.position-label.clearfix .labels::text”).extract() 即在 position-label clearfix 中的”空格”换成” . “


欢迎各位看官及技术大佬前来交流指导呀,可以邮件至 jqiange@yeah.net