详解BeautifulSoup获取特定标签下内容的方法
以下是个人在学习beautifulSoup过程中的一些总结,目前我在使用爬虫数据时使用的方法的是:先用find_all()找出需要内容所在的标签,如果所需内容一个find_all()不能满足,那就用两个或者多个。接下来遍历find_all的结果,用get_txt()、get(‘href')、得到文本或者链接,然后放入各自的列表中。这样做有一个缺点就是txt的数据是一个单独的列表,链接的数据也是一个单独的列表,一方面不能体现这些数据之间的结构性,另一方面当想要获得更多的内容时,就要创建更多的空列表。
遍历所有标签:
soup.find_all('a')
找出所有页面中含有标签a的html语句,结果以列表形式存储。对找到的标签可以进一步处理,如用for对结果遍历,可以对结果进行purify,得到如链接,字符等结果。
#创建空列表 links=[] txts=[] tags=soup.find_all('a') fortagintags: links.append(tag.get('href') txts.append(tag.txt)#或者txts.append(tag.get_txt())
得到html的属性名:
atr=[] tags=soup.find_all('a') fortagintags: atr.append(tag.p('class'))#得到a标签下,子标签p的class名称
find_all()的相关用法实例:
实例来自BeautifulSoup中文文档
1.字符串
最简单的过滤器是字符串.在搜索方法中传入一个字符串参数,BeautifulSoup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的标签:
soup.find_all('b') #[TheDormouse'sstory]
2.正则表达式
如果传入正则表达式作为参数,BeautifulSoup会通过正则表达式的match()来匹配内容.下面例子中找出所有以b开头的标签,这表示和标签都应该被找到:
importre fortaginsoup.find_all(re.compile("^b")): print(tag.name) #body #b
下面代码找出所有名字中包含”t”的标签:
fortaginsoup.find_all(re.compile("t")): print(tag.name) #html #title
3.列表
如果传入列表参数,BeautifulSoup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有标签和标签:
soup.find_all(["a","b"]) #[TheDormouse'sstory, #Elsie, # Lacie, # Tillie]
4.方法(自定义函数,传入find_all)
如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数[4],如果这个方法返回True表示当前元素匹配并且被找到,如果不是则反回False
下面方法校验了当前元素,如果包含class属性却不包含id属性,那么将返回True:
defhas_class_but_no_id(tag): returntag.has_attr('class')andnottag.has_attr('id')```
返回结果中只有
标签没有标签,因为标签还定义了”id”,没有返回和,因为和中没有定义”class”属性.
下面代码找到所有被文字包含的节点内容:
frombs4importNavigableString defsurrounded_by_strings(tag): return(isinstance(tag.next_element,NavigableString) andisinstance(tag.previous_element,NavigableString)) fortaginsoup.find_all(surrounded_by_strings): printtag.name #p #a #a #a #p
5.按照CSS搜索
按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字class在Python中是保留字,使用class做参数会导致语法错误.从BeautifulSoup的4.1.1版本开始,可以通过class_参数搜索有指定CSS类名的tag:
soup.find_all("a",class_="sister") #[Elsie, # Lacie, # Tillie]
或者:
soup.find_all("a",attrs={"class":"sister"}) #[Elsie, # Lacie, # Tillie]
6.按照text参数查找
通过text参数可以搜搜文档中的字符串内容.与name参数的可选值一样,text参数接受字符串,正则表达式,列表,True.看例子:
soup.find_all(text="Elsie") #[u'Elsie'] soup.find_all(text=["Tillie","Elsie","Lacie"]) #[u'Elsie',u'Lacie',u'Tillie'] soup.find_all(text=re.compile("Dormouse")) [u"TheDormouse'sstory",u"TheDormouse'sstory"] defis_the_only_string_within_a_tag(s): ""ReturnTrueifthisstringistheonlychildofitsparenttag."" return(s==s.parent.string) soup.find_all(text=is_the_only_string_within_a_tag) #[u"TheDormouse'sstory",u"TheDormouse'sstory",u'Elsie',u'Lacie',u'Tillie',u'...']
虽然text参数用于搜索字符串,还可以与其它参数混合使用来过滤tag.BeautifulSoup会找到.string方法与text参数值相符的tag.下面代码用来搜索内容里面包含“Elsie”的标签:
soup.find_all("a",text="Elsie") #[Elsie]
7.只查找当前标签的子节点
调用tag的find_all()方法时,BeautifulSoup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数recursive=False.
一段简单的文档:
TheDormouse'sstory ...
是否使用recursive参数的搜索结果:
soup.html.find_all("title") #[TheDormouse'sstory ] soup.html.find_all("title",recursive=False) #[]
到此这篇关于详解BeautifulSoup获取特定标签下内容的方法的文章就介绍到这了,更多相关BeautifulSoup获取特定标签内容内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!