美文网首页
Beautifulsoup入门笔记(一)

Beautifulsoup入门笔记(一)

作者: Cytosine | 来源:发表于2017-10-16 16:41 被阅读0次
    bsObj.findAll()
    

    BeautifulSoup库里的对象

    • BeautifulSoup对象
    • 标签Tag对象:通过findfindAll、直接调用子标签
    • NavigableString对象:标签里的文字
    • Comment对象:用于查找HTML文档的注释

    处理

    处理子标签和其他后代标签

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    
    def main():
        html = urlopen('http://www.pythonscraping.com/pages/page3.html')
        bsObj = BeautifulSoup(html, 'lxml')
    
        for child in bsObj.find('table', {'id':'giftList'}).children:
            print(child)
    
    if __name__ == '__main__':
        main()
    

    处理兄弟标签

    对象不能把自己作为兄弟标签。任何时候你获取一个标签的兄
    弟标签,都不会包含这个标签本身。其次,这个函数只调用后面的兄弟标签。例如,如果我们选择一组标签中位于中间位置的一个标签,然后用 next_siblings() 函数,那么它就只会返回在它后面的兄弟标签。

    如果想让你的爬虫更稳定,最好还是让
    标签的选择更加具体。如果有属性,就利用标签的属性。

    获取标签属性

    myTag.attrs 返回一个字典,所以myImgTag.attrs['src']获取图片资源位置

    Lambda

    BeautifulSoup 允许我们把特定函数类型当作 findAll 函数的参数。唯一的限制条件是这些
    函数必须把一个标签作为参数且返回结果是布尔类型。BeautifulSoup 用这个函数来评估它
    遇到的每个标签对象,最后把评估结果为“真”的标签保留,把其他标签剔除。
    例如,下面的代码就是获取有两个属性的标签:

    soup.findAll(lambda tag: len(tag.attrs) == 2)
    

    这行代码会找出下面的标签:

    <div class="body" id="content"></div> 
    <span style="color:red" class="title"></span>
    

    如果你愿意多写一点儿代码,那么在 BeautifulSoup 里用 Lambda 表达式选择标签,将是正则表达式的完美替代方案。
    (摘自《Python网络数据采集》)

    其他库

    • lxml,http://lxml.de/,可以用来解析 HTML 和 XML 文档
    • HTML parser,Python自带的

    相关文章

      网友评论

          本文标题:Beautifulsoup入门笔记(一)

          本文链接:https://www.haomeiwen.com/subject/znvkuxtx.html