接上文,上回说到,获取a标签的所有属性,返回一个字典,用print(bs.a.atters),那接着来,
print(type(bs))
这个没什么好说的,就是打印一下获取到的bs的类型,简单放一下结果
D:\program\python\python\python.exe "D:/program/python/douban/test/test Bs4.py"
<class 'bs4.BeautifulSoup'>
进程已结束,退出代码0
(5)
print(bs.a.string)
print(type(bs.a.string))
把这两行放在一起,其作用分别是
第一行:
获取所有与a有关的东西的字符串
第二行:
打印所获取到的字符串的类型
D:\program\python\python\python.exe "D:/program/python/douban/test/test Bs4.py"
新闻
<class 'bs4.element.Comment'>
进程已结束,退出代码0
注意:Comment是一个特殊的NavigableString,输出的内容不包含注释符号
3、文档的遍历
print(bs.head.contents)
print(bs.head.contents[1])
结果
D:\program\python\python\python.exe "D:/program/python/douban/test/test Bs4.py"
['\n', <meta charset="utf-8"/>, '\n', <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>, '\n', <title>百度一下,你就知道</title>, '\n']
<meta charset="utf-8"/>
进程已结束,退出代码0
可以看到,代码第一行获取到了head的内容并打印
第二行 ,打印出head中的第一个内容,需要注意的是,这里的下标不是从0开始,而是从1开始
4、文档的搜索
(1)、find_all 字符串过滤,会查找与字符串完全匹配的内容
t_list = bs.find_all("a")
print(t_list)
结果
D:\program\python\python\python.exe "D:/program/python/douban/test/test Bs4.py"
[<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>, <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>, <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>, <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>, <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>, <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>, <a class="bri" href="http://news.baidu.com/more/" name="tj_briicon" style="...">更多产品</a>]
进程已结束,退出代码0
ps: 其实打印出来我才发现,这玩意和print(bs.a)区别不大,下面放一下对比一下
第一个
---------------------------------------------------------------------------------------------------------------------------------
t_list = bs.find_all("a")
print(t_list)
D:\program\python\python\python.exe "D:/program/python/douban/test/test Bs4.py"
[<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>, <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>, <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>, <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>, <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>, <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>, <a class="bri" href="http://news.baidu.com/more/" name="tj_briicon" style="...">更多产品</a>]
进程已结束,退出代码0
---------------------------------------------------------------------------------------------------------------------------------
第二个
---------------------------------------------------------------------------------------------------------------------------------
print(bs.a)
<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
---------------------------------------------------------------------------------------------------------------------------------
但是,一对比,我觉得我太草率了,然后我突然想到了它俩的区别
前者是把与之有关的全部寻找出来,而后者是从上往下找,只打印第一个。
(2)、正则表达式搜索:使用search()方法来匹配内容
t_list = bs.find_all(re.compile("a"))
print(t_list)
结果
D:\program\python\python\python.exe "D:/program/python/douban/test/test Bs4.py"
[<head>
<meta charset="utf-8"/>
<link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
<title>百度一下,你就知道</title>
</head>, <meta charset="utf-8"/>, <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>, <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>, <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>, <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>, <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>, <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>, <a class="bri" href="http://news.baidu.com/more/" name="tj_briicon" style="...">更多产品</a>]
进程已结束,退出代码0
仍然是查找与“a”有关的内容, 只不过换了种方法,依旧是全局搜索
(3)、传入一个函数(方法),根据函数的要求来搜索
def name_is_exists(tag):
return tag.has_attr("name")
t_list = bs.find_all(name_is_exists)
for item in t_list:
print(item)
这部分我学的也不是太懂,在这里先强行理解一下
定义一个函数,名字叫做name_is_exists(tag),第二句没看懂,返回一个tag,获取name?
第三行,找到函数指定的东西,赋值给t_list
第四行,写一个循环
打印所有在t_list中的item
---------------------------------------------------------------------------------------------------------------------------
结果
D:\program\python\python\python.exe "D:/program/python/douban/test/test Bs4.py"
[<head>
<meta charset="utf-8"/>
<link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
<title>百度一下,你就知道</title>
</head>, <meta charset="utf-8"/>, <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>, <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>, <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>, <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>, <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>, <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>, <a class="bri" href="http://news.baidu.com/more/" name="tj_briicon" style="...">更多产品</a>]
进程已结束,退出代码0
结束