Python网络爬虫入门--Day02

上一篇文章我们介绍了什么是网络爬虫,也顺带介绍了开发的一些基础常识。为了更好的进行网络爬虫的实际操作,这篇文章我们还是介绍一些爬虫相关的一些概念和一些需要了解的前情概要。

BeautifulSoup常见的四种对象

上一遍文章其实已经介绍过两个对象了,第一个是BeautifulSoup对象,它可以将我们抓取来的HTML文档结构化。第二是Tag标签,就是我们上边文章中拿到的h1标签。现在我们在介绍第三个对象,NavigaleString对象,这个对象是用来表示标签里面的文字(不是标签本身),第四个对象是Comment对象,该对象用来获取HTML文档中的注释标签。这四个对象在后面的使用会比较频繁,大家可以先记住,随着实际的应用,就会逐渐理解每个对象描述的是什么内容了。

HTML的导航树

怎么理解导航树呢?前面我们一直在说BeautifulSoup可以让我们抓取来的HTML文件结构化,这里我们就这个结构化做一个解释。HTML的标签一般都是成对存在的,而标签之前由存在父子关系或是兄弟关系又或者是后代关系,这里我给大伙画个简单的图例,大家应该更好理解一下,请看下图:
在这里插入图片描述
好吧,实在不善于画图,我们直接看真实网页上的结构。在最大的框标出来的body标签,里面有很多div和dialog标签,这个时候body标签就是div和dialog的父标签,相对的div和dialog就是body标签的子标签(这里的div和dialog标签指的是和第二个框标出来的div和dialog同级的标签)。第二个框标出来的div和dialog处于同级所以他们就是兄弟关系,同样的第三个框标出来的dialog和里面的div即为父子关系,而第三个框里面的div和最外层的body就是后代关系
为什么要介绍着三种标签关系呢。因为我们在实际爬取数据中,为了更加高效的获取数据,应当只获取我们自己需要的数据,所以就需要依赖HTML的导航树结构,来定位到我们需要的标签,从而获取到对应的数据。同事BeautifulSoup也为我们提供了操作这些标签的方法,我们直接上代码:

# https://www.pythonscraping.com/pages/page3.html  示例网页

def navigatingTree():
    html = urlopen("https://www.pythonscraping.com/pages/page3.html")
    bsObj = BeautifulSoup(html)

    for child in bsObj.find("table",{"id":"giftList"}).children: # 子标签
        print(child)

    for child in bsObj.find("table",{"id":"giftList"}).descendants: # 后代标签
        print(child)

    for sibling in bsObj.find("table",{"id":"giftList"}).tr.next_siblings: # 兄弟标签 兄弟标签首先不会选中自己,其次是向下索引 使用 previous_siblings标签可以向上索引
        print(sibling)
 
    # 查找指定途径的图片的父级标签的上一个兄弟标间的文字
    print(bsObj.find("img",{"src":"../img/gifts/img1.jpg"}).parent.previous_sibling.get_text()) # $15.00

通过BeautilfulSoul我们可以很方便的根据HTML这种导航树结构来获取指定的节点。

findAll() 和 find()方法

上篇文章中,我们使用了find()方法,这个方法是获取第一个符合我们条件的标签,而findAll()方法默认情况下是获取所有符合我们筛选条件的标签,我们根据实际的应用情况选择方法即可。
这里我们在着重介绍一下findAll()方法的几个参数,直接看代码吧,代码更清晰一点:

# finaAll(tag.attributes,recursive,text,limit,keywords) 
# tag 标签 .findAll("h1")  .findAll({"h1","h2","h3"})
# attributes 属性  .findAll("span",{"class":"green"})  .findAll("span",{"class":{"green","red"}})
# recursive 递归查找 .findAll("span",{"class":"green"},True)
# text 以文本内容去匹配 .findAll(text="the prince")
# limit 查找指定数量的元素   


def getInfo():
    html = urlopen("https://www.pythonscraping.com/pages/warandpeace.html")
    bsObj = BeautifulSoup(html)
    nameList = bsObj.findAll("span",{"class":"green"})
    for name in nameList:
        print(name) # <span class="green">Prince Vasili Kuragin</span>
        # 一般来说只有到最后我们需要输出打印信息的时候才会使用get_text()方法来去除标签
        # 一般还是尽可能的保留HTML的标签结构
        print(name.get_text()) # Prince Vasili Kuragin

    nameList2 = bsObj.findAll(text="the prince")
    for name in nameList2:
        print(name)

    allText = bsObj.findAll(id = "text")
    print(allText[0].get_text())

属性的总结我放到了最上面,一般情况下我们使用前两个属性就可以过滤掉很多我们不需要的元素了,但是后面几个元素我们还是需要了解的。举个例子,比如当limit为1时,那么就是findAll()方法和find()方法并没有区别,recursive参数设置为false时,就只会查找一层,即只会在父子关系的标签里筛选符合我们条件的标签。这些标签还是有了解的必要。

关于其他

其他的知识是更方便我们写出简介的代码,对于完全的初学者来说可能比较难掌握,这里我们只介绍一个——正则表达式。它是个什么东西呢?

之所以叫正则表达式,是因为它们可以识别正则字符串。也就是说,它们可以这么定义:如果你给我的字符串符合规则,我就返回他。或是,如果字符串不符合规则我就忽略它。这在要求快速浏览大文档,以查找像电话号码和邮箱之类的字符串时是非常方便的

在实际操作中就是帮我们匹配我们想要的样式的字符串,也可以用来做字符格式校验。我们可以回忆一下,注册某些网页的时候,是不是需要我们填写邮箱,比较正规的网页如果你填写的邮箱格式不对,是不是都会提示你格式不对,那就以邮箱为例我们一些个校验邮箱的正则字符串
直接给出结果:
[A-Za-z0-9.]+@[A-Za-z].(com|org|edu|net)
这就是校验邮箱格式的正则字符串。迷糊是正常的,因为这里很多符号我们并不清楚代表什么意思,那我把符号的含义放出来:在这里插入图片描述
大伙可以根据符号释义对照表和123456789@qq.com来理解正则。这里就是一个知识的补充,如果感兴趣的话可以关注我的公众号PythonCookbook学习笔记,讨论正则相关的知识。没有熟练掌握也没关系,后面的文章里我们还会用到,多实践几次就基本能掌握正则的知识了。

好了,今天的内容到这里就结束了,这篇文章是实际操作前的知识补充,其中的内容在后面的文章中都会用到,建议大伙都认真的了解这些知识。我们下篇文章见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值