Python小白的学习笔记(2020-5-7)

今天的话主要是记录Beautifulsoup和pyquery两个解析器的使用。
话不多说现在开始

Beautifulsoup的使用

HTML是有一堆标签tag组成的。soup可以理解成一碗汤,装了很多标签,因此tag soup就是一碗标签汤。这个翻译有点牵强。
soup也可以理解成集合,因此tag soup就是标签集合。这个更好理解些。
HTML的语法和定义是好的,有很多规范。但是不是强制的,因此变体很多。于是早年写的HTML有很多问题:嵌套深入、语法不对、结构不对、不遵守一致的语法等。
但是这些不影响浏览器的解析和展示,浏览器有很强的容错能力。
遗憾的是,这样的HTML不方便阅读和其它程序处理,因此大家称之为tag soup。
综上,BeautifulSoup的目的是做一个好的工具,帮助开发者节省时间。用铁锹而不是手,从一堆散沙里挖掘出宝藏(转自知乎)

基本的用法

from bs4 import Beautifulsoup
html=‘xxxxxxxxxxxxx’
bs=BeautifulSoup(html,‘ html parser’)
print(bs.title.string)
print(bs.prettify())

第一个会打印出title节点的文本,第二个则是打印出经过缩进过的html文本。

节点的选择以及提取信息

from bs4 import BeautifulSoup
html=‘xxxxxxxxxxxx’
bs=BeautifulSoup(html,’lxml’)
print(bs.p.name)
print(bs.title.string)
print(bs.p)

第一个会打印p节点的节点名称,第二个则答应title中的内容,第三个则是打印整个p节点,包括其所有子孙节点

打印节点的所有或其中一个属性

from bs4 import BeautifulSoup
html=‘xxxxxxxxxxxxx’
bs=BeautifulSoup(html,’lxml’)
print(bs.p.attrs)
print(bs.a.attrs[‘class’])

第一个会打印p节点的所有属性,第二个则是打印a节点的class属性

打印与节点相关联的节点(父;祖先)

from bs4 import BeautifulSoup
text=‘xxxxxxxxxxxxx’
bs=BeautifulSoup(text,‘ html.parser’)
print(bs.p.parent)
print(bs.p.parents)

第一个会打印出其父节点,第二个打印出其祖先节点

打印子节点与子孙节点

from bs4 import BeautifulSoup
with open (‘a.html’,’r’) as e:
m=e.read()
bs=BeautifulSoup(m,’html.parser’)
print(bs.p.children)
print(bs.p.contens)
print(bs.p.descendants)

第一个和第二个都是打印出p节点的子节点,不过有区别。而第二个则是打印出其子孙节点

区别:children打印出来为生成器对象,而contents打印出来则是列表

且descendants打印出来的也是生成器对象

打印单个或多个兄弟节点

from bs4 import BeautifulSoup
html=‘xxxxxxxxx’
bs=BeautifulSoup(html,‘html.parser’)
print(bs.p.next_sibling)
print(list(enumerate(bs.p.next_siblings)))
print(bs.p.previous_sibling)
print(list(enumerate(bs.p.previous_siblings)))

enumerate方法会将里面的可遍历对象变成一个索引序列,用list表示其用列表的方式展示,否则直接打印会打印出生成器对象

方法选择器(find_all,find等)

fin_all的参数
1.name(标签名)

from bs4 import BeautifulSoup
html=‘xxxxxxx’
bs=BeautifulSoup(html,’html.parser’)
print(bs.find_all(name=‘p’))
print(bs.find_all(name=‘a’)[0])

第一个会打印出html代码中所有的p节点,第二个会打印出html代码中所有的a节点中的第一个

2.attrs(属性)

from bs4 import BeautifulSoup
html=‘xxxxxxx’
bs=BeautifulSoup(html,’html.parser’)
print(bs.find_all(attrs={‘list’:’item-0}))
print(bs.find_all(attrs={‘name’:’p’}))

对于class,id等一些属性,我们可以不用上面的方法。而用类似于(id=‘list-0’)这种,但class不能直接写,因为其为关键字(类),所以要用class_
例如:

from bs4 import BeautifulSoup
import re
html=‘xxxxxxxx’
bs=BeautifulSoup(html,’html.parser’)
print(‘bs.p.find_all(text=re.compile(‘aaa’)))

另外还有其他的方法

例如:
find_parent;find_parents
find_next_sibling:find_next_siblings
find_previous_sibling;find_previous_siblings
find_all_next;find_next
find_all_previous;find_previous

CSS选择器(用select方法调用)

规则

.aaa:class为aaa的节点
#aaa:ID为aaa的节点
m:m节点
m,n:m和n节点

最重要的是,每个规则如果分开,则表示继续找,合并则表示和

例如

.aaa#bbb:表示class为aaa且id为bbb的节点
.aaa #bbb:表示class为aaa节点中id为bbb的节点

示例

from bs4 import BeautifulSoup
html=‘xxxxxxxxxxxxxxxxx’
bs=BeautifulSoup(html,’html.parse)
print(bs.select(‘.pan .new_pen’)
print(bs.select(‘html body div p a’)
print(bs.select(‘#list-0 .pan’)

第一个会打印class属性为pan中class属性为new_pan的节点;第二个会打印出html节点中的body节点中的第一个div节点中的所有a节点;第三个会打印id为list-0的节点中所有class属性为pan的节点

嵌套选择(可以将第一次选择结果赋给变量,再用变量继续查询)

from bs4 import BeautifulSoup
html=’xxxxxxxxxxxxx’
bs=BeautifulSoup(html,’html.parse’)
m=bs.select(‘.pan’)
print(m.select(‘.new_pan’)

获取属性

from bs4 import BeautifulSoup
html=‘xxxxxxxxxxxxx’
bs=BeautifulSoup(html,’html.parse’)
m=bs.select(‘html body p #list-2’)
print(m.attrs[‘id’])

from bs4 import BeautifulSoup
with open(‘a.html’,’r’) as m:
n= m.read()
bs=BeautifulSoup(n,’html.parse’)
result=bs.select(‘html body p #item-2)
print(result[‘id’])

获取文本

from bs4 import BeautifulSoup
text=‘xxxxxxxx’
bs=BeautifulSoup(html,‘ html.parse’)
m=bs.select(‘html body .pen .new_pen)
print(m.string)

print(m.get_text())

pyquery解析库的使用

初始化的方法(字符串,url,get对象,文件对象)

1.字符串

from pyquery import PyQuery as e
html=‘xxxxxxxxxx’
p=e(html)
print(p(‘a’))

2.url

from pyquery import PyQuery
m=PyQuery(url=‘www.baidu.com’)
print(m(‘head’))

3.get对象

from pyquery import PyQuery
from requests import get
py=PyQuery(get(‘www.baidu.com’).text)
print(py(‘title’))

4.文件对象

from pyquery import PyQuery
py=PyQuery(filename=‘a.html’)
print(py(‘li’))

使用CSS选择器对PyQuery对象进行选择

from pyquery import PyQuery
py=PyQuery(filename=‘a.html’)
print(py(‘html #container .item-0 li’))
print(py(‘html #pe .item-0’))

查找节点(find;children;parent,siblings等)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值