Python入门学习:Beautiful Soup 4检查页面TDKH标签

技术 赵有财 2493℃ 0评论

环境:
Python 3.3.5
beautifulsoup4-4.3.2
Eclipse + PyDev

利用Beautiful Soup 4能够很方便的提取页面的标签,那我就来写一个检查页面TDKH标签的程序,首先来理一理思路,大致有一下的步骤:
1、打开网页获取源代码
2、将代码转为Beautiful Soup 4对象
3、开始取元素内容,这个分为几块:
TDKH1应该是有且唯一的,可能有三种情况:
1)标签缺失
2)有标签,内容缺失
3)有标签,有内容
最后,是其他可以重复的标签,简单输出

下面来仔细说说源代码:

首先要引入打开网页和Beautiful Soup 4操作相关的两个模块:

import urllib.request
from bs4 import BeautifulSoup

然后下载网页源码:

url = 'http://www.zhaoyoucai.com'
encode = 'utf-8'
html = urllib.request.urlopen(url)
page = html.read()
page = page.decode(encode)

这里需要注意的是页面的编码,否则解码时候可能会报错。

下载了网页后,我代码转为Beautiful Soup 4对象,方便操作,只需一行代码:

page = BeautifulSoup(page)

接下来可以开始操作,提取需要的元素内容了,我们先来提取<title>的内容:

if page.title == None:
    print('缺失Title标签')
elif page.title.string == None:
    print('Title标签无内容')
else:
    print('Title: ',page.title.string)

正常情况下,直接用page.title.string就可以直接输出了<title>,但是还要考虑有一些网站没有设置Title的情况会报错,另外,写此测试程序的目的是为了检查网页TDKH关键标签元素,用于SEO简单诊断。

keywords和description的提取类似,这两个的标签是包含在<meta>的,先要找到name=’keywords’这样的meta标签,所以用到了Python的字典来匹配:

if page.find(attrs={"name": "keywords"}) == None:
    print('缺失Keywods标签')
elif page.find(attrs={"name": "keywords"}).get('content') == None:
    print('Keywods标签错误,无内容')
elif page.find(attrs={"name": "keywords"}).get('content') =='':
    print('Keywods标签无内容')
else:
    print ('Keywords:',page.find(attrs={"name": "keywords"}).attrs['content'])

同样需要先判断是否存在,不然报错,这里使用到了Beautiful Soup 4的find()和get()方法,find()返回第一个匹配的标签及内容,get()用于获取标签内属性的值,上面的get(‘content’)其实和attrs[‘content’]是一样的。
Description的前提类似keywords,不在赘述。

if page.find(attrs={"name": "description"}) == None:
    print('缺失description标签')
elif page.find(attrs={"name": "description"}).get('content') == None:
    print('Description标签错误,无内容')
elif page.find(attrs={"name": "description"}).get('content') =='':
    print('Description标签无内容')
else:
    print ('Description:',page.find(attrs={"name": "description"}).attrs['content'])

这里需要注意的是,标签本身大小写无关的,但是标签内容是有大小写的,例如name=’keyword’和NAME=’keyword’是一样的,但是name=’keyword’和name=’Keyword’就不一样了,比如网易(www.163.com)的”Keywords”,会报错缺失Keywods标签,缺失description标签。因此以上的匹配还需要待优化,应该先用find_all()找到meta,再找判断有name,判断name的值用lower()转为小写是不是等于’keywords’,接着才输出来,涉及到很多的判断,在此先略过了。

接下来我们开始查找H1标签,因为一般SEO都会建议页面有且只有一个H1,所以我就写的复杂点:

list_h1 = page.find_all('h1')

if len(list_h1) == 0:
    print('H1缺失')
elif len(list_h1) == 1:
    print('有一个H1:',list_h1[0].get_text(strip=True))
else:
    print('H1重复设置了,总共找到',len(list_h1),'个H1')
    for index,h1 in enumerate(list_h1):
        if len(h1) == 0:
            print('第%d个H1内容缺失'%(index+1))
        else:
            print('第%d个H1:'%(index+1),h1.get_text(strip=True))

先用find_all()读取到列表,判断列表如果没有,就是缺少H1,有了在接着判断一个还是重复多个了,这里用到了get_text(strip=True)函数,提取标签内的文本,因为我在抓部分页面时候,有的H1是有子标签的,如:

<h1>
<span class="yusi-mono">「知而不乎」</span>
<span class="yusi-bloger">关注网络营销&互联网+IT技术</span>
</h1>

如果直接使用其他string等输出会报错的。

最后是其他H元素不重要的了,简单的写了忽略判断:

for h2 in page.find_all('h2'):
    print('H2:',h2.get_text(strip=True))
for h3 in page.find_all('h3'):
    print('H3:',h3.get_text(strip=True))

总结,此程序其实是学习Beautiful Soup 4的,在写的时候测试了很多函数,最终用到的也就同

转载请注明:「知而不乎」 » Python入门学习:Beautiful Soup 4检查页面TDKH标签

喜欢 (20)or分享 (0)
如果你觉得这篇文章还有价值,对你有帮助,请支持我继续更新 !捐赠本站

关注微信公众号

知而不乎微信公众号