继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

复杂HTML代码深度解析

BluyeaSun
关注TA
已关注
手记 24
粉丝 77
获赞 3400
一. 避开复杂HTML的解析
二. BeautifulSoup简介
三. 正则表达式与BeautifulSoup
四. 获取属性
五. Lambda表达式
六. 类似的BeautifulSoup库

一. 避开复杂HTML的解析

1. 查看该网页有没有网页结构更友好的移动版,
   通过设置自己的请求头可以来访问移动版。
2. 寻找隐藏在JavaScript文件中的信息。
3. 查看该信息是否可以从其他网页中获取到。

二. BeautifulSoup简介

通过BeautifulSoup可以方便的获取结构化的数据。

1. get_text()方法
2. BeautifulSoup的find()和findAll()方法
3. 其它BeautifulSoup对象
4. 导航树

1. get_text()方法

    在获取到BeautifulSoup对象后,调用其.get_text()会把该对象
    里面的所有标签都全部去掉,以文本字符串的形式返回里面的内容。

2. BeautifulSoup的find()和findAll()方法

    findAll(tag,attribute,recursive,text,limit,keywords)

        (1) 标签参数tag
            可以是一个标签的名称也可以是一个列表
            例如查找一个html中的所有标题标签
            .findAll(['h1','h2','h3','h4','h5'])
            .findAll('h1')
        (2) 属性参数attributes
            是用一个字典封装一个标签的若干属性和对应的属性值。
            返回HTML文档中里所有的红色与绿色标签
            .findAll("span",{"class":["green","red"]})
        (3) 递归参数recursive
            是一个布尔变量。
            True 会查找所有的后代标签
            False 只查找子标签
        (4) 文本参数text
            是对标签里面的文本内容做匹配。
            例如查找标签中the prince 的标签数量
            nameList = obj.findAll(text="the prince")
            print len(nameList)
        (5) 限制参数limit
            当指定limit=1,便是find()方法.只返回第一个查找到的对象
        (6) 关键字参数 keywords
            如bsObj.findAll(id="text")
            返回id为text的对象,由于属性关键字可以完全是实现其功能
            所以不推荐使用该参数,且有时使用该参数时会发生奇怪的错误。

3. 其它BeautifulSoup对象

  NavigableString对象用来表示标签里的文字而非标签
  Comment对象用来表示HTML文档的注释标签

4. 导航树

  (1) 处理子标签和其他后代标签
      children 属性获取所有子标签
      descendant 属性获取所有后代标签
  (2) 处理兄弟标签
       beautifulsoup对象的 next_sibings 属性
       (获取之后的所有兄弟标签)加上get_text()
       方法使得处理表格十分的方便。
  (3) 处理父标签
       parent 属性

三. 正则表达式与BeautifulSoup

    正则表达式可以作为beautifulsoup的语句的任一个参数使用,
    让目标元素的查找更加的方便。
    例如查找图片中的src属性值以../img/gifts/img开头,以.jpg结尾
    images = bsObj.findAll("img":
        {"src":re.compile("\.\.\/img\/gifts/img.*\.jpg")})

四. 获取属性

获取一个标签对象的全部属性返回一个字典
且对象的属性值为列表的形式
   myTag.attrs
获取某一个属性
   myTag.attrs["someAttr"][0]

五. Lambda表达式

BeautifulSoup允许我们把一个lambda表达式
当做findAll函数的参数。唯一的限制条件是必须
把一个标签作为参数且返回的结果是布尔类型。

beautifulsoup用这个函数来判断它遇到的每一个标签对象,
最后把评估结果为“真”的标签保留,把其他标签去除。

例如: 获取有两个属性的标签
soup.findAll(lambda tag: len(tag.attrs)==2)

六. 类似的BeautifulSoup库

lxml
    和beautifulsoup一样优秀,里面的xpath甚至比beautifulsoup
    还要快速方便,并且xpath里面的路径可以直接通过chrome来获取。
PyQuery
    pyquery 可让用jQuery的语法来对xml进行操作。非常像jQuery API而已。
HTML parser
    python自带的解析库,不用安装可以直接使用。
打开App,阅读手记
6人推荐
发表评论
随时随地看视频慕课网APP