Beautiful Soup 使用总结

Beautiful Soup 用来方便的解析 html 和 xml 文档,实现快速的在文档树中查找、提取、跳转。

Beautifusoup 将整个文档分为四种对象:Beautifusoup对象、bs4.element.tag 简称 tag 对象、bs4.element.NavigableString 简称 string 对象、bs4.element.Comment 简称 comment 对象。Beautifusoup 对象表示整颗树,其他三种对象都可以看作是树上的节点。

 

<span class="green">Anna Pavlovna</span>

上边整个片段就是一个tag,span 是tag 的名称。Anna Pavlovna 是 string对象,被界定在 “ > ” 与 “ < ” 之间。 comment 对象其实是特殊的 string 对象,背界定在 "<!--" 和 “-->“ 之间,如下边片段中的 “some comment” .

 

 

"<b><!--some comment--></b>"

整颗文档树按照节点来组织,自然在跳转时,按照节点之间的关系:父节点(parent),兄弟节点(sibling),子节点(children 这里指的是直接子节点),后代节点(descendants 包含直接子节点和间接子节点),前后节点(这里前后指的是按解析的顺序,所以前后节点可能是前边四种中的任何 一种)。另外,需要注意的是单数与复数的差别,单数返回的单个对象或者None,复数返回的是 list (空或非空)。

 

常用的文档过滤方法 .find_all 和 find 的说明。

函数原型:soup.findAll(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
比如:

过滤时,都是按照节点来过滤的,匹配到的都是整个节点。 text 参数名也可以用 string 来代替,貌似之前的有的版本叫为 text ,有的版本中叫 string。

实际查找的节点就两种:tag 和 string。name 参数要查找的 tag ,支持 字符串,字符串容器,布尔量True,函数。参数为方法时,按照鸭子类型,该方法的参数为tag 对象,函数的返回值的按 鸭子行为 进行约束,函数的返回值为布尔量即可。注意该方法实际是从来以递归迭代的方式每个tag都进行尝试。

 

def has_href_and_id(tag):
    return tag.has_attr('class') and tag.has_attr('id')

 

 

<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

标签a 有三个属性:class,href,id.  属性的值为 “=“ 右边的内容。这里的属性不在dir() 列表当中。通过 a.get(“id”) 或 a["id"] 来获取,后者在属性不存在时会抛出异常。

 

例子中可以用 .find("a", id = "link3") 进行限定。id = "link3" 被打包进 kwargs 关键字参数中。或者用 bsObj.findAll(**{"id":"link3"}) 让属性键值对解包传给 kwargs,或者 bsObj.findAll(attr = {"id":"link3"}) 使用关键字参数。.find("a", "link3") 则表示不指定属性的名字,只匹配值。

 

html = '<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>'
soup = BeautifulSoup(html, "lxml")
soup.find("a", href = re.compile("example"))
soup.find(re.compile("^a"), {"href" : re.compile("example")})
#<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> # 输出

soup.find("a", {"id" : ("link", "link3")})   #属性也可以是字符串容器来表示,只要匹配容器中的一个元素即可

 

通过属性来过滤时,也可以为属性传入一个函数,注意此函数的参数使用的是属性,当然返回值一样是布尔量。

 

def func(value):
    return value and re.compile("red").search(value) or value == "link3"
soup.find(id = func)
#<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>  #输出

这里提到的两次可以传入函数作为函数,注意在函数内部都先对参数进行非空判断,防止抛出异常。比如上边的 return value and ...

 

^-^ 正则表达式可以作为 Beautifusoup 查找方法中的任何一个参数。

 

 

使用Python编写爬虫,首先需要安装Python解释器。可以在Python官网上下载安装包,或者使用系统自带的包管理器安装。 接下来,可以选择一个适合的爬取框架,如Scrapy或Beautiful Soup。Scrapy是一个功能强大的爬虫框架,提供了许多方便的功能和工具来编写和管理爬虫。Beautiful Soup是一个用于解析HTML和XML文档的库,可以帮助你从网页中提取数据。 在编写爬虫代码之前,需要先确定你要爬取的目标网站,并了解其网页结构和数据的位置。然后,你可以使用Python的请求库,如Requests,来发送HTTP请求并获取网页内容。 接下来,你可以使用爬虫框架或库提供的功能来解析网页内容,提取所需的数据。对于Scrapy,你可以定义爬虫类,指定要爬取的URL和解析规则。对于Beautiful Soup,你可以使用其提供的方法来查找和提取特定的标签和数据。 当爬虫的代码较复杂时,可以将爬虫封装成函数。这样可以方便地调用爬虫,并且可以在不同的程序中复用爬虫代码。 如果需要爬取大量数据,可以考虑使用分布式爬虫的方法来加速爬取。分布式爬虫可以使用多台机器同时爬取网页,从而大大提升爬虫的效率。 总结来说,使用Python编写爬虫的基本步骤包括安装Python解释器、选择爬取框架或库、发送HTTP请求获取网页内容、解析网页内容并提取数据、封装爬虫代码成函数以及考虑使用分布式爬虫提升效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值