Python爬虫||BeautifulSoup4库-以小猪短租为例

由于上次的文章被同学吐槽了,正则表达式过于麻烦,那就用BeautifulSoup库吧,比正则表达式简单太多了!只需要简单的几条语句,即可完成网页中某个元素的提取。他是python的一个HTML或者XML的解析库,主要的功能是解析和提取 HTML/XML 数据。
但注意,bs仅用于HTML文件,可以是请求后的网站也可以是本地HTML文件。
BeautifulSoup库是解析,遍历,维护标签树的功能库。
安装:pip install beautifulsoup4
由于BeatutifulSoup3已经没有人维护了,所以需要安装BeatutifulSoup4。

预备知识

导入库

from bs4 import BeautifulSoup

BeautifulSoup的四大对象。

tag(标签)

使用find()方法获取到的结果都是tag对象。

  • tag.name : 获取标签名称。
  • tag.attrs : 获取标签内所有属性,返回内容用字典形式保存(键值对)。
  • 也可以用层级形式进行定位,如:soup.body.div.div.p,但比较麻烦,在BeautifulSoup中实用性不是很高。

内部文字

直接调用.string即可。

BeautifulSoup

即文档全部内容,可以分别取里面的各个属性。

comment

是一种特殊的内部文字,调用时需要对调用内容进行判断。

BeautifulSoup的节点

用这个方法可以使用目标节点的附近节点来进行查找目标节点。

子节点与子孙节点

  • contents:将子标签存入列表。
  • children:将子标签存入一个迭代器,不是列表。仅包含tag的直接子节点。

父节点与祖先节点

  • parent:返回父节点的tag。
  • parents:返回祖先节点。

兄弟节点

兄弟节点是存在同一层级下的,如果不存在就返回none。
next_sibling:下一个

  • previous_sibling:上一个

前后节点

  • next_element:下一个
  • previous_element:上一个

文档搜索

将BeautifulSoup的基本概念都了解了之后就要使用了,最常用的就是find()和find_all()方法。
属性定位:soup.find_all(‘a’,id=‘name’)
多属性定位:soup.find_all(‘a’,class=“tod”,id=“name”)
前面提到,find()方法获取到的结果都是tag对象,这和HTML文档中的tag相同,可以直接用tag.name和tag.attrs访问对象的属性和名字。

find方法

find()方法返回的是单个元素,也就是第一个匹配的元素,而前者返回的是所有匹配的元素组成的列表。
代码格式为:

find(self,name , attrs , recursive , text , **kwargs)

直接返回结果,不返回列表。

find all()方法

用于查找所有元素,
相较于正则表达式快很多。只需要给它传入一些属性或文本,就可以得到符合条件的元素,功能很强大。
代码格式为:

find_all(name , attrs , recursive , text , **kwargs)

返回结果为列表。

find和find_all的区别

BeautifulSoup中find()方法和find_all()方法的使用方法是一样的,区别在于;

  • find返回第一个结果,格式为字符串。find_all()返回的是包含所有结果的列表。
  • find找不到目标时返回none,find_all()找不到目标时返回空列表。

实战演示-小猪短租

学会了BeautifulSoup后就用BeautifulSoup4库尝试爬取小猪短租网站上的信息,代码如下:

import requests
import re
from bs4 import BeautifulSoup


url = "http://xa.xiaozhu.com/search-duanzufang-p1-0/"  #小猪短租
headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"}
data = requests.get(url,headers)  #请求
re = data.text  
soup = BeautifulSoup(re,'lxml')  #用lxml解析器进行解析

这样就已经获取到网页的信息了,接下来就对网页上的信息进行提取,先提取网页上每一个信息的url,使用find_all方法。

url = []
for i in range(len(soup.find_all('div',attrs = {'class':'result_btm_con lodgeunitname'}))):
    url.append(soup.find_all('div',attrs = {'class':'result_btm_con lodgeunitname'})[i].attrs['detailurl'])
url

这样就可以提取到网页上的信息。

CSS选择器

Beautiful Soup还提供了另外一种选择器,那就是CSS选择器。使用CSS选择器时,只需要调用select()方法,传入相应的字符串参数,就可以通过CSS选择器来找到相应的tag。
形式为:

[code]选择器{样式}[/code]

在BeautifulSoup中CSS选择器的使用方法主要为下面三种:

  • 通过id查找:
soup.selsct("name")
  • 通过class查找:
soup.selsct(".efg")
  • 通过属性查找:
soup.selsct('a[class="efg"]')

和find_all的实现功能一样,但更为方便些。

BeautifulSoup在爬虫中主要担任数据清洗的任务,掌握BeautifulSoup能解决大部分网站数据清洗问题。

注:本次抓取数据仅作学习研究之用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章