1、解析库的使用
1、XPath的使用(XML Path Language)
1、常用规则
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
示例://title[@lang=‘eng’]
代表选择所有名称为title,同时属性lang值为eng的节点
2、如果想获取li节点内部的文本,两种方式:
-
先选取a节点再获取文本
result = html.xpath('//li[@class="item-0"]/a/text()
获取子节点a的文本 -
使用//选取
result = html.xpath('//li[@class="item-0"]//text()
获取所有子孙节点的文本
3、属性多值匹配
使用contains()
函数,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的值就完成匹配
text = '''
<li class="li li-first"><a href="">first time</a></li>
'''
result = html.xpath('//li[contains(@class,"li")]/a/text()')
4、多属性匹配
根据多个属性确定一个节点,用运算符and
连接,此外还有很多别的运算符用法相同
text = '''
<li class="li li-first" name="item"><a href="">first time</a></li>
'''
result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')
2、Beautiful Soup的使用
1、是Python的一个HTML或XML的解析库,用来从网页中提取数据,会自动将输入文档转换为Unicode编码,输出文档转换为UTF-8编码。
2、
- contents属性得到的是直接子节点的列表
- descendants属性会递归查询所有子节点,得到所有的子孙节点
- next_sibling和previous_sibling分别获取节点的下一个和上一个兄弟元素,next_siblings和previous_siblings分别返回所有前面和后面的兄弟节点的生成器
3、方法选择器
- find_all()
- find()
4、CSS选择器
- 调用
select()
方法,如soup.select('ul')
- 获取文本的两种方式:string属性、get_text()
- CSS选择器常用语法规则
选择器 | 例子 | 例子描述 |
---|---|---|
.class | .intro | 选择class="intro"的所有节点 |
#id | #container | 选择id="container"的所有节点 |
* | * | 选择所有节点 |
element | p | 选择所有p节点 |
element,element | div,p | 选择所有div节点和所有p节点 |
element element | div p | 选择div节点内部的所有p节点 |
element>element | div>p | 选择父节点为div的所有p节点 |
element+element | div+p | 选择紧接在div节点之后的所有p |
[attribute] | [target] | 选择带有target属性的所有节点 |
[attribute=value] | [target=blank] | 选择target="blank"的所有节点 |
[attribute~=value] | [title~=flower] | 选择title属性包含单词flower的所有节点 |
:link | a:link | 选择所有未被访问的链接 |
:visited | a:visited | 选择所有已被访问的链接 |
3、pyquery
1、字符串初始化
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('li')) # 打印所有的li节点
2、传入URL
from pyquery import PyQuery as pq
doc = pq(url='https://cuiqingcai.com')
3、基本的CSS选择器
doc('#container .list li')
先选取id为container的节点,再选取其内部class为list的节点内部的所有li节点。具体参考上面CSS语法规则find()
查找所有的子孙节点,children()
只查找子节点
4、遍历
pyquery选择结果都是PyQuery类型
- 单个节点
直接打印print(li)
或者转成字符串print(str(li))
- 多个节点就要调用
items()
lis = doc('li').items()
5、获取信息
- 获取属性
调用attr()
方法
a = doc('.item-0.active a')
print(a.attr('href'))
- 获取文本
调用text()
方法
2、数据存储
1、MongoDB存储
1、插入数据
insert_one()
、insert_many([data1,data2])
2、查询数据
find_one({Key:Value})
、find({'age':{'$gt':20}})
查找年龄大于20的数据
比较符号表
符号 | 含义 | 示例 |
---|---|---|
$lt | 小于 | |
$gt | 大于 | {‘age’:{’$gt’:20}} |
$lte | 小于等于 | |
$gte | 大于等于 | |
$ne | 不等于 | |
$in | 在范围内 | {‘age’:{’$in’:[20,23]}}} |
$nin | 不在范围内 |
功能符号表
符号 | 含义 | 示例 | 示例含义 |
---|---|---|---|
$regex | 匹配正则表达式 | {‘name’:{’$regex’:’^M.*’}} | name以M开头 |
$exists | 属性是否存在 | {‘name’:{’$exists’:True}} | name属性存在 |
$type | 类型判断 | {‘age’:{’$type’:‘int’}} | age的类型为int |
3、计数
count()
方法
4、排序
sort()
方法,示例:
results = collection.find().sort('name',pymongo.ASCENDING)
指定升序排列,降序则是pymongo.DESCENDING
5、偏移
skip()
和limit()
方法可以指定偏移几个元素和指定要取的个数
results = cllection.find().skip(2).limit(2)
注:数据库数量庞大时候如千万、亿级别,最好不要使用大的偏移量查询,很可能导致内存溢出。可以使用比较符号表的操作符来查询
6、更新
condition = {'name':'Kevin'}
student = cllection.find_one(condition)
student['age'] = 26
result = cllection.update_one(condition, {'$set':student})
condition = {'age':{'$gt':20}}
result = cllection.update_many(condition,{'$inc':{'age':1}})
3、Ajax数据爬取
1、Ajax
1、就是异步的JavaScript和XML,利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。