⾸先创建⼀个html⽂件:my.html ⽤于测试XPath\Beautiful Soup\PyQuery的解析效果
<!DOCTYPE html>
<html>
<head>
<title>我的⽹⻚</title>
</head>
<body>
<h3 id="hid">我的常⽤链接</h3>
<ul>
<li class="item-0"><a href="http://www.baidu.com">百度</a></li>
<li class="item-1 shop"><a href="http://www.jd.com">京东</a></li>
<li class="item-2"><a href="http://www.sohu.com">搜狐</a></li>
<li class="item-3"><a href="http://www.sina.com">新浪</a></li>
<li class="item-4 shop"><a href="http://www.taobao.com">淘宝</a></li>
</ul>
</body>
</html>
1 Xpath
1.1 Xpath简介
- XPath(XML Path Language)是⼀⻔在XML⽂档中查找信息的语⾔。
- XPath 可⽤来在XML⽂档中对元素和属性进⾏遍历。
- 需要使用 pip install lxml 安装lxml库
1.2 使用Xpath进行解析
# 使用XPath解析HTML网页内容
from lxml import etree
# 准备html文件信息(在真实项目中是从互联网中爬取网页信息)
f = open("./my.html","r",encoding="utf-8")
content = f.read()
f.close()
# 使用lxml创建节点选择器对象
html = etree.HTML(content)
# 使用xpath解析网页中的元素节点(标签)
#result = html.xpath("/*") #获取所有直接子节点
#result = html.xpath("//*") #获取所有子节点
result = html.xpath("//li") #获取所有li子节点
for t in result:
print(t.tag,end=" ")
print()
#解析网页中所有的超链接信息
#result = html.xpath("//li") #获取所有li子节点
#result = html.xpath("//li[@class='item-0']") #获取所有class属性值为item-0的li子节点
result = html.xpath("//li[contains(@class,'shop')]") #获取所有class属性值含有shop的li子节点
#遍历
for t in result:
#获取当前li节点中的a子节点
a = t.find("a")
#输出当前a节点的属性和内容
print(a.text,":",a.get("href"))
2 Beautiful Soup
2.1 Beautiful Soup解析库简介
- BeautifulSoup是Python的⼀个HTML或XML解析库,最主要的功能就是从⽹⻚爬取我们需要的数据。
- BeautifulSoup将html解析为对象进⾏处理,全部⻚⾯转变为字典或者数组,相对于正则表达式的⽅式,可以⼤⼤简化处理过程。
- Beautiful Soup3 ⽬前已经停⽌开发,我们推荐在现在的项⽬中使⽤Beautiful Soup4,
- 在已经安装lxml库的前提下安装Beautiful Soup解析器:pip install beautifulsoup4
2.2 Beautiful Soup解析库的使用
# 导入模块
from bs4 import BeautifulSoup
# 读取html文件信息(在真实代码中是爬取的网页信息)
f = open("./my.html",'r',encoding="utf-8")
content = f.read()
f.close()
# 创建解析对象
soup = BeautifulSoup(content,"lxml")
- 第一种:节点选择器解析
# 获取ul,并从ul中获取所有子节点
blist = soup.ul.children
#遍历
for li in blist:
if li.name == 'li': # 判断必须是li节点
a = li.a
print(a.string,":",a.attrs['href']) # 输出a标签节点的内容和属性
- 第二种:方法选择器
blist = soup.find_all("li") #获取所有li节点
#遍历内容进行输出
for li in blist:
a = li.find("a") #获取li中的a节点
print(a.get_text(),":",a.attrs['href']) #输出a标签节点的内容和属性
- 第三种:CSS选择器
blist = soup.select("ul li") # 获取ul中的所有li节点
#遍历
for li in blist:
a = li.select("a")[0] # 获取li中a节点
print(a.get_text(), ":", a.attrs['href']) # 输出a标签节点的内容和属性
3 PyQuery
3.1 PyQuery解析库简介
- PyQuery库也是⼀个⾮常强⼤⼜灵活的⽹⻚解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你⾮常绝佳的选择。
- PyQuery 是 Python 仿照 jQuery 的严格实现。
- 语法与 jQuery ⼏乎完全相同,所以不⽤再去费⼼去记⼀些奇怪的⽅法了。
- PyQuery的安装: pip install pyquery
3.2 PyQuery解析库的使用
# 主要用于解析文件
from pyquery import PyQuery
with open("./my.html", "r", encoding="utf-8")as f:
content = f.read()
result = PyQuery(content)
# print(result('title'))
# print(result('#hid'))
'''
print(result("ul li a")) # 获取url中li中的a
print(result("a:first")) # 获取网页中第一个a
print(result("a:last")) # 获取网页中最后一个a
print(result("a:eq(2)")) # 获取网页中索引位置为2的a
'''
# # 获取class属性值为shop的所有节点
# print(result('.shop'))
#
# # 获取class属性值shop的所有li节点
# print(result('li.shop'))
# print(result("a[href*='jd']")) # 获取href属性值中含有‘jd’的a节点
# 获取网页中所有ul中li的a节点
alist = result("ul li a")
for a in alist.items():
# print(a)
# print(a.attr('href'))
# print(a.text())
print(a.text(),":",a.attr.href)
4 解析结果
百度 : http://www.baidu.com
京东 : http://www.jd.com
搜狐 : http://www.sohu.com
新浪 : http://www.sina.com
淘宝 : http://www.taobao.com
网友评论