网页数据的解析提取——parsel(XPath、CSS)

网页数据的解析提取——parsel(XPath、CSS)对于爬虫爬取到的网页信息,如何从其中获取我们需要的信息是一个非常重要的部分。而使用正则表达式则会显得非常麻烦,而且容易出错,幸好,python提供了很多解析库,例如lxml、beautifulsoup、pyquery、parsel等等,我们可以从中选取一种或几种来使用。注意,使用解析库并不能直接获

大家好,欢迎来到IT知识分享网。

  对于爬虫爬取到的网页信息,如何从其中获取我们需要的信息是一个非常重要的部分。而使用正则表达式则会显得非常麻烦,而且容易出错,幸好,python提供了很多解析库,例如lxml、beautifulsoup、pyquery、parsel等等,我们可以从中选取一种或几种来使用。

注意,使用解析库并不能直接获取我们需要的信息,解析库只能对网页信息进行解析,然后再依靠选择器来定位html节点。选择器一般来使用XPath或者CSS

本文主要介绍parsel解析库,以及一部分简单的Xpath和CSS。

详细的XPath和CSS选择器请见以下两篇文章:

XPath:https://www.cnblogs.com/zhuohua/articles/16363015.html

 CSS选择器:https://www.cnblogs.com/zhuohua/articles/16363017.html

parsel库的使用

  1、介绍

    parsel库可以解析HTML和XML,并支持XPath和CSS选择器,同时还融合了正则表达式的提取功能。非常灵活且强大。

  2、初始化

    一般来说,使用parsel库中的Selector类来声明一个对象,该类传入一个文档内容作为参数,返回经过解析后的selector对象,该对象可以使用XPath和CSS进行内容提取。

import requests
from parsel import Selector

html = requests.get('https://ssr1.scrape.center').text
# 创建一个Selector对象,向其中传入html文档
selector = Selector(text=html)

  3、XPath和CSS选择

# 使用xpath items2 = selector.xpath('//a[contains(@class, "name")]') print(len(items), type(items), items, sep=' | ')
#
使用css选择器 items = selector.css('.name') print(len(items), type(items), items, sep=' | ')

    网页数据的解析提取——parsel(XPath、CSS)

  上述第一句代码,对selector对象调用XPath方法,//a[contains(@class, “name”)]表示获取对象中类型class=name的 a 标签,该方法返回一个列表,列表的对象名为SelectorList,该列表的元素就是selector对象,由一个一个selector对象组成,一个selector对象就代表获取到的一个符合XPath的标签。并且,也可以继续调用Xpath方法对selector对象进行选择。

  下面的代码就是一个selector对象。

<Selector xpath="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' name ')]" data='<a data-v-7f856186="" href="/detail/1...'>

    对于CSS选择器,其实其底层是依靠XPath实现的,就是将CSS选择器先转化为XPath,再进行节点提取,这没啥好说的。

  4、提取文本

  对于selectorList对象,可以用get()方法将其中的第一个selector转换为字符串(如果只有一个selector对象,就不存在第一个这种说法)。如果要将其中所有selector对象都转换为字符串,则需要用getall()方法。注意:返回的字符串不一定是文本,也可以是一个标签!这取决于selector对象是什么样的。

  因为我们获取的对象中类型class=name的 a 标签得到的结果是一个列表,因此,我们选对列表进行遍历,遍历将得到一个selector对象,对selector对象再调用css选择.m-b-sm *::text‘,这会选择其中所有的class=”m-b-sm”  的标签的文本(即上图的“”霸王别姬 – Farewell My Concubine“”),并且返回的也是一个SelectorList对象(该SelectorList对象的selector对象是由纯文本转换的)然后在对这个SelectorList对象调用get()方法,将其中第一个selector对象转换为字符串并返回,因为我们css选择的时候就是选中的文本内容,所以返回的字符串也是文本。(如果只有一个selector对象,就不存在第一个这种说法)

for item in items2:
    text = item.css('.m-b-sm *::text').get()
    print(text)

  5、提取属性

  对于属性,同文本也是类似的,在Xpath或CSS选择器里表示要提取的属性即可返回包含selector对象(该对象有属性转换而成)的SelectorList对象,即便只有一个selector对象,返回的也是SelectorList对象。

  然后调用get()或getall()方法,将selector对象转换为字符串即可。

  

最后附上完整代码,可以运行分析理解一下

import requests
from parsel import Selector

html = requests.get('https://ssr1.scrape.center').text
# 创建一个Selector对象,向其中传入html文档
selector = Selector(text=html)
print(type(selector),end='\n')
# 使用css选择器
items = selector.css('.name')
print(len(items), type(items[0]), items, sep=' | ')
# 使用xpath
items2 = selector.xpath('//a[contains(@class, "name")]')
print(len(items), type(items), items, sep=' | ')
print('-'*100)
print(items2.get())
print('-'*100)
for item in items2:
    text = item.css('.m-b-sm *::text')
    print(text)
    print(text.get())

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/27636.html

(0)
上一篇 2023-12-02 07:15
下一篇 2023-12-07 14:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信