Python爬虫必备之XPath解析库
在爬取网页数据时,我们通常会用到网页解析库来提取我们需要的数据,而XPath解析库就是其中之一。本文将详细介绍XPath解析库的使用,包括基本语法、定位元素、使用条件进行筛选、获取属性值等方面,并附带两个实例来进一步说明。
什么是XPath?
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath解析库的安装
我们可以通过pip来安装XPath解析库:
pip install lxml
安装完成后,我们就可以在Python中使用XPath解析库了。
开始使用XPath解析库
获取并解析HTML
首先,我们需要获取要解析的HTML文本,并将其解析成一棵树形的结构。示例代码如下:
import requests
from lxml import etree
url = 'https://www.example.com'
response = requests.get(url)
html = response.text
etree_html = etree.HTML(html)
基本语法
XPath解析库的基本语法包括:/
、//
、.
、..
、text()
、@
等。
/
:在XPath中,/
用于从根节点开始查找。//
:在XPath中,//
用于在文档中查找匹配的元素。.
:在XPath中,.
代表当前节点。..
:在XPath中,..
代表当前节点的父节点。text()
:在XPath中,text()
用于获取节点的文本内容。@
:在XPath中,@
用于获取节点的属性。
定位元素
我们可以通过XPath表达式来定位HTML中的元素。以下是一些常用的XPath表达式:
- 选取节点:
nodename
- 选取属性:
@attribute
- 选取所有子节点:
*
- 选取当前节点的所有子节点:
./*
- 选取当前节点的下一个节点:
./following-sibling::node()
- 选取当前节点的所有兄弟节点:
./following-sibling::*
- 选取多个路径:
//book | //cd
示例代码:
# 获取所有a标签
a_list = etree_html.xpath('//a')
# 获取第一个a标签
a = etree_html.xpath('//a[1]')
# 获取所有class = "button"的a标签
a_list_with_class_button = etree_html.xpath('//a[@class="button"]')
# 获取所有包含class属性的a标签
a_list_with_class = etree_html.xpath('//a[@class]')
使用条件进行筛选
我们也可以使用条件来对节点进行筛选。以下是一些常用的条件表达式:
- 等于:
[@attribute="value"]
- 包含:
[contains(@attribute,"value")]
- 大于:
[@value > "number"]
- 小于:
[@value < "number"]
- 与:
[condition1 and condition2]
- 或:
[condition1 or condition2]
示例代码:
# 获取所有href属性包含example的a标签
a_list_with_href_example = etree_html.xpath('//a[contains(@href,"example")]')
# 获取所有包含example的文本的p标签
p_list_with_example_text = etree_html.xpath('//p[contains(text(),"example")]')
获取属性值
我们可以使用@
来获取节点的属性。示例代码:
# 获取第一个a标签的href属性值
a_href = etree_html.xpath('//a[1]/@href')[0]
实例
示例一:解析GitHub贡献者数据
我们可以使用XPath解析库从GitHub中爬取某个仓库的贡献者数据。
import requests
from lxml import etree
url = 'https://github.com/tensorflow/tensorflow/graphs/contributors'
response = requests.get(url)
html = response.text
etree_html = etree.HTML(html)
# 定位每个贡献者的元素
contributor_list = etree_html.xpath('//div[@class="contrib-person"]')
for i, contributor in enumerate(contributor_list):
# 获取贡献者姓名
name = contributor.xpath('.//span[@class="contrib-person-name"]/a/text()')[0]
print(str(i+1) + '. ' + name)
该程序将输出贡献者的姓名。
示例二:解析图书信息
我们可以使用XPath解析库从某个在线书店中爬取某类图书的信息。
import requests
from lxml import etree
url = 'https://www.example.com/books'
response = requests.get(url)
html = response.text
etree_html = etree.HTML(html)
# 定位每本图书所在的元素
book_list = etree_html.xpath('//div[@class="book"]')
for book in book_list:
# 获取图书名
title = book.xpath('.//h3[@class="book-title"]/a/text()')[0]
# 获取作者
author = book.xpath('.//div[@class="book-author"]/a/text()')[0]
# 获取价格
price = book.xpath('.//div[@class="book-price"]/span/text()')[0]
print(title + ' | ' + author + ' | ' + price)
该程序将输出图书的名称、作者以及价格。
结语
XPath解析库是Python爬虫中常用的解析工具之一,学会使用它,可以帮助我们更加轻松地爬取网页数据。本文只是对XPath解析库的基础使用进行了简单的介绍,读者可以根据自己的需求进一步深入学习。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫必备之XPath解析库 - Python技术站