BEAUTIFUL SOUP

头文件 from bs4 import Beautifulsoup

编译器(不太懂html):

似乎有lxml和html.parser?(一个用不了用另一个)lxml似乎要先下载

自动识别文件编码形式并转换文件内容:

from bs4 import UnicodeDammit
dammit=UnicodeDammit(res,['utf-8','gbk'])
res=dammit.unicode_markup#转换成可读文件

 

查找文档元素:

.find_all(name,attr,recursive , text , **kwargs)和正则表达式的findall很像

name :查找所有名字为 name 的tag,字符串对象会被自动忽略掉;
attrs:根据属性查询,使用字典类型;
text :可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True ;
recursive:调用tag的 find_all() 方法时,BS会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点则recursive=False(变find)
limit:find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,

可以使用 limit 参数限制返回结果的数量当搜索到的结果数量达到 limit 的限制时,就停止搜索返回

例:.find_all(name='none',attri='x')可以找出所以属性等于x的语句,返回列表

find(name,attr)和正则表达式的search很像(只找一个)返回是字符串

因为html文档是树形文档有头必有尾,所以查找到name后会以列表的形式返回一条语句:

但只能对bf类进行find 。

xxx.select("x[attr='y'] z") 表示查找所有属性等于y的x节点下的z节点(如果没有z则是所有节点 包括换行空格之类的 )无论找到几个返回的都是一个列表 z前面一定要有空格不然编译都过不了不要问我为什么知道如果引号嵌套则里面应该是单引号

xxx.prettify():相当于代码的自动补全,这里是尽量补全html的树形文档

xxx.parent可以获得xxx的父节点 输出也是字符串

xxx.children 可以获得xxx的所有儿子节点

xxx.desendants 可以获得所有的子孙节点 几乎不用

xxx.previous_sibling 可以获得前面一个和他同级(兄弟)的节点

xxx.next_sibling 可以获得后面一个和他同级的节点 (文本也算一个节点)

xxx.name可以获得当前字符串所属的节点的名字 输出时字符串

import re
import urllib.request
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
url='https://www.cnblogs.com/cherrypill/'
user_agent={'user_agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"}
req=urllib.request.Request(url,headers=user_agent)#装成浏览器

res=urllib.request.urlopen(req)
doc=res.read()#读取网页

dammit=UnicodeDammit(res,['gbk','utf-8'])#自动识别
res=dammit.unicde_markup #转码

#doc=doc.decode() 自动转码后就不需要这个了

soup=BeautifulSoup(doc,"html.parser")
s=soup.prettify()#相当于代码的自动补全这里是尽量补全html的树形文档

element=soup.find_all(name='a',attrs={'class','c_b_p_desc_readmore'})

print(element)#这是读取我博客首页所有可以展开阅读的链接

[<a class="c_b_p_desc_readmore" href="https://www.cnblogs.com/cherrypill/p/12382736.html">阅读全文</a>, <a c....,<a...<\a>]#太多了就不写了

 

find_all返回的列表自带一个[attrs_name]可以返回名字为name的属性,(相当于返回了一个字典)而.text函数可以返回后面的文本

for i in element:
    print(i['href'],i.text)
输出;
https://www.cnblogs.com/cherrypill/p/12382736.html 阅读全文
https://www.cnblogs.com/cherrypill/p/12378028.html 阅读全文
https://www.cnblogs.com/cherrypill/p/12374229.html 阅读全文
https://www.cnblogs.com/cherrypill/p/12367998.html 阅读全文

zhaiyao=soup.find(name='div',attrs={'class',"c_b_p_desc"})
print(zhaiyao)

<div class="c_b_p_desc">
摘要:我刚开始写这个新博客,要是能关注就在好不过了。在下方订阅,以便能看到我的新文章。 也欢迎来踩我的wordpress(还没有域名就是了):https://misaka.design.blog/ 博客园和wordpress同时更新            <a class="c_b_p_desc_readmore" href="https://www.cnblogs.com/cherrypill/p/12382736.html">阅读全文</a>
</div>

print(zhaiyao.text)

摘要:我刚开始写这个新博客,要是能关注就在好不过了。在下方订阅,以便能看到我的新文章。 也欢迎来踩我的wordpress(还没有域名就是了):https://misaka.design.blog/ 博客园和wordpress同时更新            阅读全文

 

还有些高级查找(自己写函数)就不写了(没怎么看懂代码)
bs的东西很多我就粗略说说
更详细的可以参考这篇https://cuiqingcai.com/1319.html


posted @ 2020-03-04 09:46  Sakura_Momoko  阅读(187)  评论(0编辑  收藏  举报