Skip to content

python强大的爬虫css+xpath解析器:parsel

0 背景

在写爬虫的时候, 我们经常需要对网页源码进行解析, 对于html的解析, 我们通常会使用xpath | pyquery | beautifulsoup 等框架去进行解析, 每种框架都有它自己的优势, 因为在不同的网页可以选择不同的解析器.

在面对简单清晰的网页结构时, 我们可以css选择器去完成我们的数据解析, 而在面对复杂的网页结构时, 我们可以选择xpath. 这样基本可以满足我们的需求, 不同的场景下, 方便程度也不同.

我觉得有时候css的选择器好处是, 可以对复杂的class进行解析, 因为有时候, 有的网页规则不规范, 比方说<div class="fruit phone"><div class="phone fruit">其实是一样的, 但是在xpath中我们使用@class去提取的话, 会相对复杂一些, 另外有的<div class="phone ">像这种在class里面加了一个空格, xpath使用'//div[@class="phone"]'就会失效, 这时候可能就需要多写一段代码. 如果说使用css选择器就很简单, 不需要考虑这种class中有排序的问题, 可以使用'li.fruit.phone::text', 因此, 本文介绍这个parsel框架, 也主要是想结合两者的优势.

那能否二者结合使用呢? 当然是可以的.

parsel 是一个 Python 的第三方库,专门用于解析和提取 HTML 和 XML 数据。它基于 lxmlcssselect 构建,提供了强大且灵活的解析能力。结合了 lxmlcssselect 的优势, 在scrapy项目中, 也有类似的功能, 结合了css选择器和xpath.

parsel 具有以下优势:

  1. 简单parsel 提供了一个非常简洁且直观的 API,使得解析 HTML/XML 数据变得非常简单。
  2. 强大的解析器:利用 parsel,我们就可以使用 CSS 或 XPath 选择器轻松地提取网页中的数据。这使得在定位和提取网页中的特定元素变得非常方便。因为有时通过css定位很快, 有时复杂的通过xpath很快.
  3. 灵活性parsel 不仅可以用于简单的网页抓取任务,还能够处理复杂的网页结构和数据提取需求。
  4. 与 Scrapy 兼容parsel 与 Scrapy 框架高度兼容,经常被用于 Scrapy 项目中进行数据提取。这为需要进行大规模网页抓取的项目提供了极大的便利。

1 使用

1 安装和导入

pip install parsel

执行其他操作前, 先导入模块.

from parsel import Selector

2 创建选择器

html_text = """
<html>
    <body>
        <div id="content">
            <h1>Hello, Orange!</h1>
            <ul>
                <li class="fruit">Orange</li>
                <li class="fruit phone">Apple</li>
                <li class="phone yylx">HuaWei</li>
            </ul>
            <ul>
                <li class="phone">XiaoMi</li>
                <li class="phone">OPPO</li>
            </ul>
        </div>
    </body>
</html>
"""

html = Selector(text=html_text)

3 数据提取

使用 .get() 获取单个结果,或使用 .getall() 获取所有匹配的结果。

获取第一个标签的文本内容(获取结果数组的第一个).

# 获取第一个标签的文本内容
item = html.css('li.fruit::text').get()

# Orange

获取第一个标签的所有文本内容的数组

item = html.css('li.phone::text').getall()

# ['Apple', 'HuaWei', 'XiaoMi', 'OPPO']

获取节点的内部的所有文本(将文本拼接起来)

# 获取内部所有文本
item = html.css('ul').xpath('string(.)').get()

删除节点

item = html.css('li.phone.fruit').drop()

提取属性

item = html.css('a.link::attr(href)').get()

# /orange.html
item = html.xpath('//a[@class="link"]/@href').get()

# /orange.html

当然, 除了xpath和css, 我们也可以使用正则提取:

item = html.css('li').re('>(O.*?)<')

# ['Orange', 'OPPO']

item = html.css('li').re('>O.*?<')

# ['>Orange<', '>OPPO<']

2 关于

综合来看,parsel 是一个强大且灵活的工具,它融合了css选择器 & xpath & 正则表达式三种解析库, 非常适合于进行网页数据抓取和解析的各种项目。

最后, 欢迎关注我的微信公众号.