# -*- coding: utf-8 -*- #爬取的网页为:http://www.pythonscraping.com/pages/warandpeace.html from urllib.request import urlopen from bs4 import BeautifulSoup html=urlopen("http://www.pythonscraping.com/pages/warandpeace.html") #第二个参数'lxml',应该是解析引擎 bsObj=BeautifulSoup(html,'lxml') #找到所有span标签,并且这些span标签的class='green' nameList=bsObj.findAll("span",{"class":"green"}) for name in nameList: #get_text获取该节点的字符 #会把正在处理的HTML文档中的所有标签都清除,然后返回一个值包含文字的字符串。 print(name.get_text()) nameList=bsObj.findAll(text="the prince") print("包含“the prince”内容的标签数量",len(nameList)) #findAll有一个关键字参数keyword,例如 allText=bsObj.findAll(id='text') #这个和表达式返回的结果是一样的,bsObj.findAll("",{"id":"text"}) #keyword偶尔会出现问题,如果使用class='ete',那么会出错的,因为class是python保留的关键字 #这个时候可以使用class_='ete'来代替 print("从哪开始的?",allText[0].get_text()) #处理子标签和后代标签 #子标签是指父标签的下一级 #后代标签是指父标签的下面所有级别的标签 #所有的子标签一定是后代标签,但是并不是所有后代标签都是子标签 #一般情况下,BeautifulSoup函数总是处理当前标签的后代标签 #例如,bsObj.div.findAll("img"):找除文档中的第一个div标签,然后获取这个div后代里所有的img标签 #如果只想找除子标签,可以使用.chilren标签: html=urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj=BeautifulSoup(html,'lxml') for child in bsObj.find("table",{"id":"giftList"}).children: print("child:",child) for sibling in bsObj.find("table",{"id":"giftList"}).tr.next_siblings: print("sibling:",sibling)#为什么会还有个空的sibling #总共有,children,parent,parents,next_siblings,next_sibling,previous_sibling,previous_sibling #BeautifulSoup还可以和正则表达式一起使用 import re images=bsObj.findAll("img",{'src':re.compile("\.\./img/gifts/img.*\.jpg")}) for image in images: #这个image和image.attrs是什么关系 print(image.attrs['src']) # print(image['src']) #BeautifulSoup还可以允许我们把特定的函数类型当作findAll函数的参数, # 唯一的显示条件是这些函数必须把一个标签当作参数,且返回结果为bool类型。 #保留评估结果为真的那些标签 #例如, print(bsObj.findAll(lambda tag:len(tag.attrs)==2))#,获取具有两个属性的标签
bs4中的BeautifulSoup
猜你喜欢
转载自blog.csdn.net/hsc_1/article/details/80477523
今日推荐
周排行