BeautifulSoup和PyQuery学习

先假设一段html:

html='''        
<html>
 <body>
  <div class="nav">
   <ul class="navbar"><li><a class="active" data-act="home-click" href="/">首页</a></li>
<li>
     <a data-act="movies-click" href="/films"> 电影 </a>
    </li> <li><a data-act="cinemas-click" href="/cinemas"> 影院 </a></li><li>
     <a data-act="board-click" href="/board">榜单 </a></li> <li>
     <a data-act="hotNews-click" href="/news"> 热点 </a> </li> <li>
     <b href="/edimall"> 商城</b> 
</li>
 </ul>
</div>
</body>
</html>
'''

导入了两个模块,其中lxml需要自己安装,不然只能用python自带的html.parse。

from bs4 import BeautifulSoup
import re

起始步骤:最初的html格式转换为<class 'bs4.BeautifulSoup'>格式

soup=BeautifulSoup(html,'lxml')#指定语法分析器,lxml需要安装
soup.prettify()#把要解析的字符串以标准缩进的格式输出

三个方法:选择标签、选择属性和值:

print(soup.a.string)#选择第一个a标签里的文本
print(soup.a.attrs)#打印第一个a标签的所有属性和值,并以字典的形式返回
print(soup.a.attrs['class'])#打印第一个a标签clas属性的值
type(soup.a.attrs):<class 'dict'>

find方法:

for tags in soup.find_all('a'):#find_all方法,查找a标签
    print(tags.string.strip())

#其他的find_all方法:
tag1=soup.find_all(attrs={'data-act':"board-click"})#用于识别非id、name、class
tag2=soup.find_all(class_='active')
tag3=soup.find_all(id='movies-click')
#将re模块和find_all 结合
for tag in soup.find_all(text=re.compile('商城')):
    print(tag)

#find方法查询单个结果
type(tag) and type(tags):<class 'bs4.element.Tag'>

css选择器:

#css选择器
tag5=soup.select('li b')#选择li标签下所有的b标签
for tag in tag5:
    print(tag.string)

ps:bs4中的子节点没有写,因为没有弄懂,运行的时候在电脑上没有效果,还有感觉没什么用。

PyQuery:

导入设置:

from pyquery import PyQuery as pq

格式化为pyquery格式 

doc=pq(html)#可以是字符串、URL、文件名
print(doc('li').text())#打印所有li标签下的内容

#CSS选择器:
print(doc('.active'))#.是class,#是id
#find方法返回所有的节点
point=doc.find('a')#返回所有的a节点,这一点和bs4不一样
print(type(point[0]))
#<class 'lxml.etree._Element'>
#子节点、父节点、兄弟节点:
item=doc('a')
print(item.children())#打印li的所有子节点,不包括li
print(item.children('b'))#li节点下筛选打印的节点
print(item.parent())#返回父节点
print(item.parents())#返回所有父节点
print(item.siblings())#兄弟节点
for i in item.items():#items()方法会得到一个生成器,遍历之后就可以得到逐个节点
     print(i.text())
     print(i.html())#获得HTML文本

#打印i的类型
print(type(i))
<class 'pyquery.pyquery.PyQuery'>
#获取属性
doc=pq(html)
item=doc('a')#需要先选标签
print(item.attr('data-act'))#获取第一个data-act属性的值:home-click

节点操作和伪类选择器没看! 

节点操作:
li.addClass('active')
li.removeClass('active')
li.attr('name','link')
li.text('changed item')
li.html('<span>changed item</span>')

伪类选择器:
from pyquery import PyQuery as pq
doc=pq(html)
li.doc('li:first-child')
li.doc('li:last-child')
li=doc('li:nth-child(2)')#选择第二个<li></li>节点
li=doc('li:gt(2)')#选择第二个<li></li>节点之后的节点
li=doc('li:nth-child(2n)')#偶数个<li></li>节点
li=doc('li:contains(second))')#包含second文本的<li></li>节点

比起soup.a.string,我更喜欢pyquery的doc('li a'),其他的(文本提取、字符节点、css选择器),两者差不多。

注意bs4的find方法只能查找一个,而pyquery的find方法是查找所有。

获取属性的方法:attr:bs4中是soup.i.attrs:打印i标签的所有属性:print(BeautifulSoup(html,'lxml').a.attrs)
pyquery中是需要先选中标签,然后查找标签下的属性:doc=pq(html)、item=doc('a')、item.attr('href')

bs4跟容易一点,pyquery更灵活一点。

猜你喜欢

转载自blog.csdn.net/qq_41375702/article/details/87923634