js提取指定网站内容(parsel集XPath和pyquery为一体,可以灵活使用两者的表达式 )
优采云 发布时间: 2022-01-16 07:22js提取指定网站内容(parsel集XPath和pyquery为一体,可以灵活使用两者的表达式
)
parsel集成了XPath和pyquery,可以灵活使用这两种表达式。
安装
pip install parsel
了解html解析库
之前学过pyquery和XPath,爬虫的html解析库,概念是一样的,不外乎:
在系统学习python爬虫的过程中,如果这个概念不清楚,对后续学习会有很大的阻力。之所以一定要学parsel库,是因为想学好python爬虫,必须学习scrapy爬虫框架,而parsel是框架的基础。
解析解析
from parsel import Selector
html = '''hello, parsel
hello, xpath
'''
selector = Selector(text=html)
items_css = selector.css('h1')
items_xpath = selector.xpath('//h1')
在parsel中选择节点,css和xpath方法效果一样。其实底层的css方法也是XPath方法。就效果而言,两者没有区别。 Parsel 只提供了一种灵活的节点选择方式供我们选择。 .
两种选择节点的方法返回的SelectorList是一个可迭代对象,可以通过遍历来操作。
items_css = selector.css('h1')
items_xpath = selector.xpath('//h1')
for item in items_css:
print(item)
for item in items_xpath:
print(item)
>>>
两次遍历的结果相同,数据收录相同的内容。
提取文本
from parsel import Selector
"""
parsel集pyquery 和XPath一体,支持使用css选择器和XPath表达式
"""
html = '''
hello, parsel
hello, xpath
'''
selector = Selector(text=html)
items_css = selector.css('.dv span')
items_xpath = selector.xpath('//div[@class="dv"]/span')
print(items_css.getall())
print(items_css.get())
>>>
['锅大虾的自学网站', '百度', '网易']
锅大虾的自学网站
SelectorList 有两种提取节点的方法,get 和 getall。结合上面的例子,get方法返回SelectorList的第一个节点对象,getall返回SelectorList的所有节点。
print(type(items_css.getall()))
print(type(items_css.get()))
>>>
经过测试,getall返回一个列表,get返回一个字符串。
只使用get和getall,只提取节点,可以使用XPath方法提取文本。
items_css = selector.css('.dv span')
items_xpath = selector.xpath('//div[@class="dv"]/span')
for item in items_css:
text = item.xpath('.//text()').get()
print(text)
>>>
锅大虾的自学网站
百度
网易
你也可以使用getall直接从节点选择中提取返回列表,不用遍历,然后遍历处理:
xpath_items = selector.xpath('//div[@class="dv"]/span/a/text()').getall()
print(xpath_items)
>>>
['锅大虾的自学网站', '百度', '网易']
当然也可以先提取文本所在的节点,然后遍历提取:
for item in items_css:
text = item.xpath('.//text()').get()
print(text)
>>>
锅大虾的自学网站
百度
网易
# 提取属性
attr = selector.css('.dv span a::attr(href)').getall()
for a in attr:
print(a)
# 这个方法和上面的是等效的,parsel两种提取的方法
attr = selector.xpath('//div[@class="dv"]/span/a/@href').getall()
print(attr)
>>>
https://nodepro.cn
https://baidu.com
https://163.com
['https://nodepro.cn', 'https://baidu.com', 'https://163.com']