• crawl——bs4 之遍历文档树


    概要

    遍历文档树:即直接通过标签名字选择,特点是选择速度快,但如果存在多个相同的标签则只返回第一个
    #1、用法
    #2、获取标签的名称
    #3、获取标签的属性
    #4、获取标签的内容
    #5、嵌套选择
    #6、子节点、子孙节点
    #7、父节点、祖先节点
    #8、兄弟节点
    
    总结:
    -soup.body.p
    -取属性 soup.body.p.attrs 或者 soup.body.p['name']
    -取文本soup.body.p.text 把子子孙孙的文本拼到一起
    -取文本soup.body.p.string 只取当前p标签的文本,如果还有子标签,取出None
    -取文本soup.body.p.strings 取出子子孙孙标签的文本,放到一个生成器中

    代码

    #pip3 install beautifulsoup4
    from bs4 import BeautifulSoup
    
    
    html_doc = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title" id='id_pp' name='lqz'>asdfasdf<b>asdfas</b></p>
    
    <p class="story">Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
    
    <p class="story">...</p>
    """
    
    soup=BeautifulSoup(html_doc,'lxml')
    
    # 遍历文档树(速度快)
    
    #1、用法
    # head=soup.head
    # print(head)
    # print(type(head))
    
    # p=soup.body.p
    # p=soup.p
    # print(p)
    
    
    #2、获取标签的名称
    # p=soup.p.name  # 对象.name 取到标签的名字
    # print(p)
    #3、获取标签的属性
    # p=soup.p['class']   # class 是列表,可以有多个
    # name=soup.p['name']
    
    # attr=soup.p.attrs  # 所有属性放到字典中
    # print(attr)
    #4、获取标签的内容
    
    # t=soup.p.text  # 把p标签文本+子标签文本都拿出来
    # print(soup.p.string) # p下的文本只有一个时,取到,否则为None
    # print(soup.p.strings) #拿到一个生成器对象, 取到p下所有的文本内容
    # print(list(soup.p.strings)) #拿到一个生成器对象, 取到p下所有的文本内容
    
    #5、嵌套选择
    # b=soup.body.p.b
    # print(b)
    
    #6、子节点、子孙节点
    # print(soup.p.contents) #p下所有子节点
    # print(soup.p.children) #得到一个迭代器,包含p下所有子节点
    # print(list(soup.p.children)) #得到一个迭代器,包含p下所有子节点
    #
    # for i,child in enumerate(soup.p.children):
    # print(i,child)
    #
    # print(soup.p.descendants) #获取子孙节点,p下所有的标签都会选择出来
    # for i,child in enumerate(soup.p.descendants):
    # print(i,child)
    #7、父节点、祖先节点
    
    # print(soup.a.parent) #获取a标签的父节点
    
    # print(soup.a.parents) #找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
    # print(list(soup.a.parents)) #找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
    
    
    #8、兄弟节点
    # print(soup.a.next_sibling) #下一个兄弟
    # print(soup.a.previous_sibling) #上一个兄弟
    #
    # print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
    # print(list(soup.a.previous_siblings)) #上面的兄弟们=>生成器对象
  • 相关阅读:
    docker
    redis 3.2.6 on ubuntu 14.04
    go异常处理
    go语言的命令行库
    iptables
    nsq
    etcd-v2第一集
    rabbitmq, windows/linux, c/c++/node.js/golang/dotnet
    zeromq:c,c++,golang及nodejs使用
    golang下的grpc
  • 原文地址:https://www.cnblogs.com/guojieying/p/14305331.html
Copyright © 2020-2023  润新知