parsel的使用
parsel库可以解析HTML和XML,并支持使用xpath和css选择器对内容进行提取和修改,支持三大功能:.css(),.xpath(),.re()
1.初始化
在使用css选择器,xpath还是re,都先需要创建一个Selector对象
from parsel import Selector
html = '''
<div>
<ul>
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
selector = Selector(text=html)
item = selector.css('.item-0') # 选取属性包含.item-0的节点
"""
从item这个输出结果可以看出使用css选择器筛选出来的节点是xpath属性的,这是因为使用传入的css选择器会首先转变成xpath,真正用于提取节点的是xpath
"""
"""从item这个输出结果的类型可以看出是可迭代对象SelectorList,如果需要获取所有的li节点就需要使用遍历"""
print(len(item), type(item), item)
item1 = selector.xpath('//li[contains(@class="item-0")]') # 选取属性包含.item-0的节点
print(item1)
"""
这两种方法输出的结果都是一样的
"""
2.提取文本
from parsel import Selector
html = '''
<div>
<ul>
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
selector = Selector(text=html)
items = selector.css('.item-0')
for item in items:
text = item.xpath('.//text()').get() # get方法的作用是从Selectorlist里面提取一个Selector对象,然后输出其中的结果
print(text)
items2 = selector.xpath('//li[contains(@class, "item-0")]//text()').get()
"""先将所有属性值包含item-0的节点选出来,然后使用get方法将Selector对象提取出来,总共选择了3个li节点,但是返回的只有第一个节点的文本内容,
这是因为get方法只提取第一个Selector对象"""
print(items2)
items3 = selector.xpath('//li[contains(@class, "item-0")]//text()').getall()
print(items3)
items4 = selector.css('.item-0 *::text').getall() # *用来提取所有子节点,提取文本需要使用::text
print(items4)
"""最终的输出结果都是一样的"""
3.提取属性
from parsel import Selector
html = '''
<div>
<ul>
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
selector = Selector(text=html)
items = selector.css('.item-1 a::attr(href)').getall() # 提取所有属性值包含item-1的节点下a节点的href属性
print(items)
items1 = selector.xpath('//li[contains(@class, "item-1")]/a/@href').getall()
print(items1)
“”“这两种方法的结果是一样的”“”
4.正则提取
from parsel import Selector
html = '''
<div>
<ul>
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
selector = Selector(text=html)
items = selector.css('.item-1').re('link.*?l') # 提取class属性值包含item-1的li节点,然后使用正则将a节点下的href属性中的link提取出来
print(items)
items1 = selector.css('.item-0 *::text').re('.*item') # 提取class属性值包含item-0的li节点的文本,然后使用正则将内容提取出来
print(items1)
items2 = selector.css('.item-0 *::text').re_first('.*item') # 选取第一个匹配正则表达式的内容
print(items2)