爬虫--2.三种解析库(XPath、Beautiful Soup、PyQuery)

下面将以代码的形式展现,熟练掌握怎么用代码输出:

XPath

from lxml import etree

f = open('./my.html','r',encoding='utf-8')
content = f.read()
f.close()

# 解析HTML⽂档,返回根节点对象
html = etree.HTML(content)

# 获取⽹⻚中所有标签并遍历输出标签名
result = html.xpath("//*") #  获取所有子节点
result = html.xpath("/*") # 获取直接子节点
result = html.xpath("//li") # 获取所有li节点
result = html.xpath("//li/a")# 获取所有li节点下的所有直接a⼦节点
result = html.xpath("//a/..") #获取所有a节点的⽗节点

for t in result:
    print(t.tag,end=" ")
print()


# 获取id属性为hid的h3节点中的⽂本内容
print(html.xpath("//h3[@id='hid']/text()")) #输出内容:['我的常⽤链接']

# 解析网页中所有超链接信息
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:
    a = t.find("a")
    print(a.text,":",a.get("href"))


'''
HTML元素的属性:
 tag:元素标签名
 text:标签中间的⽂本
HTML元素的⽅法:
 find() 查找⼀个匹配的元素
 findall() 查找所有匹配的元素
 get(key, default=None) 获取指定属性值
 items()获取元素属性,作为序列返回
 keys()获取属性名称列表
 value是()将元素属性值作为字符串序列
'''

Beautiful Soup

// An highlighted block
var foo = 'bar';# 导⼊模块
from bs4 import BeautifulSoup

# 读取html⽂件信息(在真实代码中是爬取的⽹⻚信息)
f = open('./my_1.html','r',encoding='utf-8')
content = f.read()
f.close()

# 创建解析对象
soup = BeautifulSoup(content,'lxml')

#第一种:节点选择器解析
print(soup.title) # 输出结果:<title>我的网页</title>

#输出⽹⻚中title标签中的内容
print(soup.title.string) # 输出结果:我的网页

print(soup.h3)  # 输出结果:<h3 id="hid">我的常用链接</h3>
print(soup.li)#获取第⼀个li元素标签. 输出结果:<li class="item-0"><a href="http://www.baidu.com">百度</a></li>
print(soup.ul)
print(soup.ul.contents)


# 获取ul,并从ul中获取所有子节点
blist = soup.ul.children
print(blist)    # 输出结果:<list_iterator object at 0x0000026712FD80D0>
#所以需要去遍历输出:
for li in blist:
    # print(li.name)   # 输出结果:None li None li None li None li None li None
    # 这里的None实际上代表的是换行符,想要判断必须是li节点,去除这些None
    if li.name == 'li':
            a = li.a
            print(a.string,":",a.attrs['href']) # 输出a标签节点的内容和属性
            '''输出结果:
            百度 : http://www.baidu.com
            京东 : http://www.jd.com
            搜狐 : http://www.sohu.com
            新浪 : http://www.sina.com
            淘宝 : http://www.taobao.com
          '''

# 第二种:方法选择器:
blist = soup.find_all("li") # 获取所有li节点
for li in blist:
    a = li.find("a") # 获取所有li中a节点
    # print(a.string,":",a.attrs['href'])
    print(a.get_text(),":",a.attrs['href'])


# 第二种:CSS选择器:
print(soup.select("li")) #获取所有li节点
print(soup.select("li.shop")) #获取含有shop的li节点
print(soup.select("ul li a")) #获取ul⾥⾯li下⾯的a元素节点
blist = soup.select("ul li")
for li in blist:
    a = li.select("a")[0] # 获取li中a节点,[0]是因为生成的是个列表,所有要索引值读取出来
    # print(a)
    # print(li)
    print(a.get_text(),":",a.attrs['href'])

PyQuery
在这之前,有个问题:在进行url初始化的时候是可以正常运行的,但是需要导入本地文件的时候,就是一直报错,后面也找到了两种解决方法:

from pyquery import PyQuery as pq

# URL初始化-----这个是正常运行的
doc = pq(url="http://www.baidu.com",encoding="utf-8")
print(doc('title'))

# ⽂件初始化--这个一直是报错290:我的是win10系统,好像mac系统就不会报错
doc = pq(filename='my.html',encoding = 'utf-8')
print(doc('title'))

#针对文件初始化找到的解决方法1with open('my.html','r',encoding='UTF-8') as f:  # 打开新的文本
    text_new = f.read()
doc = pq(text_new)
print(doc('title'))

#方法2:是将my.html文件中的中文改成英文就可以正常运行

完整代码:

from pyquery import PyQuery as pq

# ⽂件初始化
with open('my.html','r',encoding='utf-8') as f:
    text_new = f.read()
doc = pq(text_new)
print(doc('title'))   # 输出结果:<title>我的网页</title>
print(doc('h3'))  # 输出结果:<h3 id="hid">我的常用链接</h3>
print(doc('#hid')) # 输出结果:<h3 id="hid">我的常用链接</h3>
print(doc('ul li'))
'''输出结果:
        <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 shop"><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>
'''
print(doc('ul li a'))# 获取ul li中的所有a标签
print(doc('a')) # 获取所有a标签
print(doc('a:first')) #获取网页中第一个a标签
print(doc('a:last')) #获取网页中最后一个a标签

# 获取class属性值shop的所有节点
print(doc(".shop"))
print(doc("li.shop"))# 获取class属性值shop的所有li节点

print(doc("a[href *= 'jd'")) # 获取href属性值中含有'jd'的a节点

#获取网页中所有ul中li里的a节点
#方法1:
alist = doc("ul li a")
print(alist)
'''输出结果:
<a href="http://www.baidu.com">百度</a>
<a href="http://www.jd.com">京东</a>
<a href="http://www.sohu.com">搜狐</a>
<a href="http://www.sina.com">新浪</a>
<a href="http://www.taobao.com">淘宝</a>
'''
print(alist.attr.href) # 输出结果:http://www.baidu.com
print(alist.html()) # 输出结果:百度  都是输出第一个数值,所以最好是能够去进行遍历输出

#方法2-----遍历输出:
for a in alist.items():
    print(a)
    print(a.attr.href)
    #print(a.text())/print(a.html())
    print(a.text(),":",a.attr.href)
'''输出结果:
<a href="http://www.baidu.com">百度</a>
<a href="http://www.jd.com">京东</a>
<a href="http://www.sohu.com">搜狐</a>
<a href="http://www.sina.com">新浪</a>
<a href="http://www.taobao.com">淘宝</a>
'''

'''输出结果:
http://www.baidu.com
http://www.jd.com
http://www.sohu.com
http://www.sina.com
http://www.taobao.com
'''

'''输出结果:
百度 : http://www.baidu.com
京东 : http://www.jd.com
搜狐 : http://www.sohu.com
新浪 : http://www.sina.com
淘宝 : http://www.taobao.com
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值