美文网首页
Python爬虫的3种内容解析方式

Python爬虫的3种内容解析方式

作者: ShowMeCoding | 来源:发表于2020-06-21 21:08 被阅读0次

⾸先创建⼀个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

相关文章

网友评论

      本文标题:Python爬虫的3种内容解析方式

      本文链接:https://www.haomeiwen.com/subject/dbmlxktx.html