BeautifulSoup详解
引入BeautifulSoup:
from bs4 import BeautifulSoup #意思就是从bs4这个包里面引入BeautifulSoup这个类
之后,使用以下语法来把请求之后的响应传入解析器:
soup = BeautifulSoup(response.text, features='lxml')
features='lxml’是一个声明解析的方式,相应的解释方式还有:
html.parse
html5lib
xml 【这个是唯一支持XML的解析器】
详细的区别请移步百度去百度相应的解释方式是什么意思。因为一般lxml就基本满足使用了。
1.访问单个标签:
print(soup.h1)#(连标签也一起返回了)
2.查找所有标签:
all_a = soup.find_all('a') print(all_a) #查找所有的 a 标签,返回的是一个所有a标签组成的列表 all_href = [a['href'] for a in all_a] #循环所有a标签组成的列表 里面的 所有 a标签, #并访问其'href'属性,这里的访问规则就像是访问字典一样。 print('\n', all_href) #返回所有的href属性的值组成的列表
其实BeautifulSoup能做的事情可多着呢
例如:
soup = BeautifulSoup(response.text, features='lxml') month = soup.find_all('li',{"class" : "month"})#访问所有 含有"month"的class属性的li标签,返回满足条件的所有li标签组成的列表。 for m in month: print(m.get_text()) #get_text()获取标签的文字内容【字符串内容、值【不是属性的值】】 #或者 month = soup.find_all(class_= "month"})
BeautifulSoup还能在一棵树中多次使用,意思就是相当于一个循环的作用。
jan = soup.find('ul', {"class": 'jan'}) #查找class属性值为jan的标签内的所有内容组成的XML树 d_jan = jan.find_all('li') #使用前面返回的结果列表作为父亲(作为这一次的Tag对象),返回所有'li'标签组成的列表 for d in d_jan:#遍历这个li标签组成的列表,寻找所需要信息 print(d.get_text())
BeautifulSoup属性查找
soup = BeautifulSoup(response.text,'lxml') print(soup.find_all(attrs={'id':'list-1'})) #查找id为list-1的标签包含的所有标签,id也可以换成其它属性 #此外,soup.find_all()直接支持id以及class的快捷查找 soup.find_all(id = 'idvalues') soup.find_all(class_ = 'classvalues')
当BeautifulSoup遇上正则表达式
soup = BeautifulSoup(htmlre, features='lxml') #find_all函数的第一个参数填入标签,第二个参数填入具体找的东西【很多时候填入属性和值,也有时候需要用正则表达式】 img_links = soup.find_all("img", {"src": re.compile('.*?\.jpg')}) for link in img_links: #遍历获取到的图片链接组成的列表 print(link['src'])
经历了find()和find_all()方法,下面接触CSS选择器【BeautifulSoup的select()方法】
一个例子:
html = ''' <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <div class="panel"> <div class="panel-heading"> <h4>Good happy</h4> </div> <div class="panel-body"> <ul class="list" id="list-1"> <li class="element">Foo</li> <li class="element">Bar</li> <li class="element">Lay</li> </ul> <ul class="list list-smail" id="list-2"> <li class="element">Foo</li> <li class="element">Bar</li> </ul> </div> </div> </body> </html> '''
1.对于class 语法: .class属性的值 返回列表(严肃点这是一个bs4.element.Tag)
print(soup.select('.panel .panel-heading'))
#根据CSS来选择,选择class='panel'下的class='panel-heading'的标签里包含的所有标签,包含他本身,组成的列表
print(soup.select('ul li')) #选择并返回所有的ul、li标签组成的列表
2.对于id 语法:#id属性的值 返回列表
print(soup.select('#list-1')) #选择id=list-1 里面的所有标签以及他本身 print(soup.select('#list-1 .element')) #选择id=list-1下的class属性值为element 里面的所有标签以及他本身
3.获取属性的值
for ul in soup.select('ul'): print(ul['id'])#获取ul的id属性的值 print(ul.attrs['id']) #或者attrs获取属性的值
4.获取标签的内容
for ul in soup.select('li'): print(ul.get_text()) #获取<tag>string</tag>里面的string