Python拥有大量的解析库,比较常用的有Beautiful Soup、pyquery、parsel等,而它们共同特点是:大部分都支持CSS选择器,所以学会了CSS选择器的用法,就能快速利用各种解析方式提取数据,下面将介绍基于bs4解析库的CSS的常用方法。
代码如下(示例):
html =
"""
<html>
<head>
<title>フィロソフィー</title>
</head>
<body>
<p class="philosophy">
<a href="https://blog.csdn.net/qq_20163065?type=blog" class='marx' id="1">フィロソフィー的个人博客</a>
</p>
<p class="C-1 C-2">多个class值的节点</p>
<p class="C-1">通过.class选择节点</p>
<p class="p-1"></p>
<p class="p-2" value="marx"></p>
<h1><a id="D1">通过#id选择节点</a></h1>
</body>
</html>
"""
from bs4 import BeautifulSoup #导入bs4库
soup = BeautifulSoup(html,features='lxml') #选择lxml解析器
逐层获取的节点:
print(soup.select('html head title')) #打印逐层获取的title节点
print(soup.select('.philosophy a'))
输出:
[フィロソフィー ]
[フィロソフィー的个人博客]
打印节点内的文本(两种方式):
print(soup.select('html head title')[0].string) #返回节点文本内容
print(soup.select('.philosophy a')[0].get_text()) #返回节点文本内容
输出:
フィロソフィー
フィロソフィー的个人博客
print(soup.select('p')[0]['class']) #获取第一个p节点的class属性值
print(soup.select('p a')[0]['href']) #获取第一个p节点下的a节点的href属性值
输出:
['philosophy']
https://blog.csdn.net/qq_20163065?type=blog
print(soup.select('p')) #选择所有的p节点,返回多个p节点的列表
print(soup.select('p')[1:]) #选择第二个p节点及后面的p节点
print(soup.select('p')[4]) #使用索引选择第五个p节点,返回单个节点
输出:
[, 多个属性值的节点
, 通过.class选择节点
, , ]
[多个属性值的节点
,
通过.class选择节点
,
,
]
通过class属性和id属性选择:
print(soup.select('.C-1')) #选择class="C-1"节点
print(soup.select('h1 #D1')) #选择h1节点下的id="D1"的节点
输出:
[多个属性值的节点
, 通过.class选择节点
]
[通过#id选择节点]
选择class属性值为C-1和C-2的节点:
print(soup.select('.C-1.C-2'))
输出:
[多个class值的节点
]
选择class="p-1"的节点和class="p-2"的节点:
print(soup.select('.p-1,.p-2')) #返回包含指定的两个节点的列表
输出:
[, ]
选择class=“philosopy“的节点下 包含href属性的节点
soup.select('.philosophy a[href]')
输出:
[フィロソフィー的个人博客]
选择value=“marx”的 节点
soup.select('p[value="marx"]')
输出:
[]
select支持嵌套选择节点
for p in soup.select('p'):
print(p.select('a'))
输出:
[フィロソフィー的个人博客]
[]
[]
[]
[]