python获取⽹络报⽂怎么解析_第14.11节Python中使⽤
BeautifulSou。。。
⼀、引⾔
在《第14.10节 Python中使⽤BeautifulSoup解析http报⽂:html标签相关属性的访问》介绍了BeautifulSoup对象的主要属性,通过这些属性可以访问标签、内容,但这种⽅法要么就只能访问符合条件的第⼀个对象,要么需要遍历访问对象,某些情况下不能通过指定特征快速定位标签和内容。本节将介绍使⽤BeautifulSoup提供的相关⽅法快速定位标签和内容的⽅法。本节继续复⽤《第14.10节 Python中使⽤BeautifulSoup解析http报⽂:html标签相关属性的访问》中的HTML⽂件和对象定义代码。
本节案例中介绍处理的c:\temp\s1.html⽂件内容如下:
BeautifulSoups使⽤⽅法 - ⽼猿Python - CSDN博客
⽼猿Python
⽼猿Python⾸⾏
⽼猿Python第⼆⾏
⽼猿Python第三⾏
创建soup对象的代码如下:
>>> from bs4 import BeautifulSoup
>>> def getsoup():
fp = open(r'c:\temp\s1.html',encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
fp.close()
print(soup)
return soup
>>> soup=getsoup()
⼆、⽅法find_all
find_all() ⽅法搜索当前标签的所有⼦节点,并判断是否符合过滤器的条件,⾮标签标记的字符串对象会被⾃动忽略掉。
1、调⽤语法:find_all( name , attrs , recursive , string ,limit, **kwargs )
2、name 参数:匹配过滤器,⽤于查所有名字满⾜name过滤器 的标签。 过滤器有⼏种类型:
1)字符串:传⼊⼀个字符串参数,Beautiful Soup会查与字符串完整匹配的标签名,注意是完整匹配,不是模糊匹配;
>>> soup.find_all('link')
[]
>>>
2)正则表达式:传⼊正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配标签名。注意在这个地⽅传⼊必须是
repile的匹配模式,如果是匹配字符串Python会认为是字符串匹配。
>>> soup.find_all(repile('h[1-2]'))
[
⽼猿Python
⽼猿Python第⼆⾏
]
3)列表:传⼊列表参数,Beautiful Soup会将与列表中任⼀元素匹配的内容返回;
>>> soup.find_all(['h1','h2'])
[
⽼猿Python
,
⽼猿Python第⼆⾏
]
>>>
4)True:True 可以匹配任何标签,将查所有的标签;
5)⽅法:传⼀个⽅法,该⽅法只有⼀个标签参数,通过这个⽅法对标签进⾏⼀些校验,满⾜条件返回 True 表⽰当前元素匹配并且被到,如果不是则返回 False。如:
>>> def findline(tag):
if tag==None: return False
content=('name')
if content==None:return False
return re.match('line',content)!=None
>>> soup.find_all(findline)
[
⽼猿Python⾸⾏
]
>>>
def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
将这个⽅法作为参数传⼊ find_all() ⽅法,将得到所有有class属性但⽆id属性的标签。
3、kwargs参数
如果⼀个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字标签的属性来搜索。如包含⼀个名字为 id 的参
数,Beautiful Soup会搜索每个标签的”id”属性。
搜索⽅法语法如下:
属性id=匹配过滤器
其中属性id要求是个合法的Python标识符,否则需要使⽤attrs参数才能进⾏匹配。匹配过滤器与name参数类似,稍有差别,主要是不⽀持列表⽅式传参,同时其匹配的内容是属性id对应的值,⽽不是标签或属性id,匹配是去查看对应属性的值是否满⾜条件。
1)根据属性值的字符串来匹配,注意是必须完全相同,如:
>>> soup.find_all(rel='canonical')
2)根据属性值的正则表达式使⽤match来匹配,如:
>>> soup.find_all(href=repile('.*'))
[, , ]
>>>
3)属性ID=True来匹配所有有该属性的标签,如:
>>> soup.find_all(rel=True)
[]
>>> soup.find_all(href=True)
[, , ]
>>>
4)⽅法:传⼀个⽅法,该⽅法只有⼀个参数,这个参数在调⽤时传递的实参时对应属性ID的属性值,通过这个⽅法对属性值进⾏⼀些校验,满⾜条件返回 True 表⽰当前元素匹配并且被到,如果不是则返回 False
>>> def gethrefinludeaticle(value):
if value==None:return False
return re.findall('article',value)
>>> soup.find_all(href=gethrefinludeaticle)
[]
>>>
注意:经⽼猿验证测试,发现在校验函数调⽤前,系统并没有先进⾏属性id的匹配成功再调⽤校验函数,⽽是所有标签属性匹配失败也会进⼊校验函数再校验,此时因为匹配失败value为None,因此对校验函数的参数进⾏None的判断⾮常重要。如果我们将value的情况输出,可以清楚看到函数的调⽤情况。如:
>>> def gethrefinludeaticle(value):
if value==None:
print("None")
return False
else:print(value)
return re.findall('article',value)
>>> soup.find_all(href=gethrefinludeaticle)
None
None
None
None
None
None
None
None
None
None
href标签怎么用None
None
None
None
[]
>>>
5)属性id为Python关键字class的匹配
按照CSS类名搜索tag的功能⾮常实⽤,但标识CSS类名的关键字 class 在Python中是保留字,使⽤ class 做参数会导致语法错误。
可以通过给class加下划线变成 class_进⾏搜索,如:
>>> soup.find_all(class='textline')
SyntaxError: invalid syntax
>>> soup.find_all(class_='textline')
[
⽼猿Python⾸⾏
]
由于tag的 class 属性是 多值属性 .按照CSS类名搜索tag时,可以分别搜索tag中的每个CSS类名,如:
css_soup = BeautifulSoup('
css_soup.find_all("p", class_="strikeout")
# [
css_soup.find_all("p", class_="body")
# [
搜索 class 属性时也可以通过CSS值完全匹配:
css_soup.find_all("p", class_="body strikeout")
# [
4、attrs参数
根据属性id和属性值的字典来匹配,可以使⽤“attrs=字典”,字典的元素的键是带引号的标签属性id,在属性id不是⼀个合法的Python标识符情况下,可以使⽤这种⽅法来匹配。根据⽼猿的测试验证,注意:class不能再加下划线,字典的值可以是上⾯所有的匹配⽅法,多个字典元素是与的关系,即要到的标签必须具有字典中所有元素对应的内容。这可是⽹上的资料及beatifulsoap官⽹都没介绍。如:
>>> def gethrefinludeaticle(value):
if value==None:return False
return re.findall('article',value)
>>> soup.find_all(attrs={'href':gethrefinludeaticle,'rel':'canonical'})
[]
>>> soup.find_all(attrs={'class':repile('.*')})
[
⽼猿Python⾸⾏
]
>>> soup.find_all(attrs={'class_':repile('.*')}) #class不能加下划线
[]
>>>
5、recursive参数
调⽤tag的 find_all() ⽅法时,Beautiful Soup会检索当前tag的所有⼦孙节点,如果只想搜索tag的直接⼦节点,可以使⽤参数
recursive=False。
6、string参数
通过 string 参数可以搜搜⽂档中的字符串内容。与 name 参数的可选值⼀样, string 参数接受 字符串 , 正则表达式 , 列表, True 。
新版本该参数名为string,⽼版本中为text,根据⽼猿的验证这两个参数使⽤效果是⼀样的,不过建议使⽤string。 如:
>>> soup.find_all(text=repile('.*'))
['html', '\n', '\n', '\t.textline{color:blue;}', '\n', '\n', 'BeautifulSoups使⽤⽅法 - ⽼猿Python - CSDN博客 ', '\n', '\n', '⽼猿Python', '\n', '⽼猿Python⾸⾏', '\n', '\n', '⽼猿Python第⼆⾏', ' ', '\n', '⽼猿Python第三⾏', ' ', '\n', '\n', '\nkeyword 参数\n如果⼀个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含⼀个名字为 id 的参数,Beautiful Soup会搜索每个tag
的”id”属性.\t']
>>> soup.find_all(string=repile('.*'))
['html', '\n', '\n', '\t.textline{color:blue;}', '\n', '\n', 'BeautifulSoups使⽤⽅法 - ⽼猿Python - CSDN博客 ', '\n', '\n', '⽼猿Python', '\n', '⽼猿Python⾸⾏', '\n', '\n', '⽼猿Python第⼆⾏', ' ', '\n', '⽼猿Python第三⾏', ' ', '\n', '\n', '\nkeyword 参数\n如果⼀个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含⼀个名字为 id 的参数,Beautiful Soup会搜索每个tag
的”id”属性.\t']
7、limit 参数
该参数在官⽹的⽅法定义中没有,但后⾯参数介绍中有,经过验证是可以使⽤的,因此⽼猿将其补充到参数中去了。使⽤ limit 参数限制返回结果的数量,当搜索到的结果数量达到 limit 的限制时,就停⽌搜索返回结果。
8、返回值
find_all的返回值是⼀个符合条件的html元素列表,每个元素就是⼀个符合条件的html元素。find_all()只搜索当前节点的所有⼦节点,孙⼦节点等。
三、find_all⽅法的简写使⽤
find_all() 是Beautiful Soup中最常⽤的搜索⽅法,所以Beautiful Soup定义了它的缩写⽅法。具体缩写⽅式为:
将“BeautifulSoup对象.find_all(参数)” 缩写为“BeautifulSoup对象(参数)”
如代码:soup.find_all(“a”)与soup(“a”)是等价的,soup.title.find_all(string=True)与soup.title(string=True)等价。
四、find
find() 搜索当前节点的所有⼦节点,孙⼦节点等是否有满⾜条件的元素,有则返回第⼀个符合条件的内容。
1.调⽤语法:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论