由于上次的文章被同学吐槽了,正则表达式过于麻烦,那就用BeautifulSoup库吧,比正则表达式简单太多了!只需要简单的几条语句,即可完成网页中某个元素的提取。他是python的一个HTML或者XML的解析库,主要的功能是解析和提取 HTML/XML 数据。
但注意,bs仅用于HTML文件,可以是请求后的网站也可以是本地HTML文件。
BeautifulSoup库是解析,遍历,维护标签树的功能库。
安装:pip install beautifulsoup4
由于BeatutifulSoup3已经没有人维护了,所以需要安装BeatutifulSoup4。
from bs4 import BeautifulSoup
使用find()方法获取到的结果都是tag对象。
直接调用.string即可。
即文档全部内容,可以分别取里面的各个属性。
是一种特殊的内部文字,调用时需要对调用内容进行判断。
用这个方法可以使用目标节点的附近节点来进行查找目标节点。
兄弟节点是存在同一层级下的,如果不存在就返回none。
next_sibling:下一个
将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(self,name , attrs , recursive , text , **kwargs)
直接返回结果,不返回列表。
用于查找所有元素,
相较于正则表达式快很多。只需要给它传入一些属性或文本,就可以得到符合条件的元素,功能很强大。
代码格式为:
find_all(name , attrs , recursive , text , **kwargs)
返回结果为列表。
BeautifulSoup中find()方法和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
这样就可以提取到网页上的信息。
Beautiful Soup还提供了另外一种选择器,那就是CSS选择器。使用CSS选择器时,只需要调用select()方法,传入相应的字符串参数,就可以通过CSS选择器来找到相应的tag。
形式为:
[code]选择器{样式}[/code]
在BeautifulSoup中CSS选择器的使用方法主要为下面三种:
soup.selsct("name")
soup.selsct(".efg")
soup.selsct('a[class="efg"]')
和find_all的实现功能一样,但更为方便些。
BeautifulSoup在爬虫中主要担任数据清洗的任务,掌握BeautifulSoup能解决大部分网站数据清洗问题。