python - bs4怎么匹配紧跟div后面的li标签
高洛峰
高洛峰 2017-04-17 17:23:26
[Python讨论组]
from bs4 import BeautifulSoup
html='''
    

A

AA

  • a1
  • a2
  • B

    BB

  • b1
  • b2
  • b3
  • C

    CC

  • c1
  • ''' soup=BeautifulSoup(html,'lxml',from_encoding='utf-8') for p in soup.findAll('p'): print(p.text,end="") for dt in p.find_all_next("li"): print("\t",dt.text,end=",") print()
     期望输出  AA a1,a2
              BB b1,b2,b3
              CC c1
              

    但是结果输出是
    AA a1, a2, b1, b2, b3, c1,
    BB b1, b2, b3, c1,
    CC c1,

    高洛峰
    高洛峰

    拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

    全部回复(2)
    大家讲道理

    find_all_next()通过 .next_elements 属性对当前tag的之后的 tag和字符串进行迭代返回所有符合条件的节点
    是直接迭代到底的不能这样用
    用.next_siblings再加个判断吧

    for p in soup.findAll('p'):
        print(p.text,end="")
        for dt in  p.find_next_siblings():
            if dt.name == 'li':
                print("\t",dt.text,end=",")
            else:
                break
        print()
    PHP中文网

    其实可以不用 for 嵌套的,一个简单的if 判断就可以:

    soup = BeautifulSoup(html)
    
    tags = soup.body
    for tag in tags:
        if tag.name == 'p':
            print('\n'+tag.string.strip(), end = ' ')
        elif tag.name == 'li' :
            print(tag.string.strip(), end = ', ')
        else:
            continue
    

    结果:

    AA a1, a2, 
    BB b1, b2, b3, 
    CC c1, 

    这样效率上要高很多,毕竟这是个 n 复杂度的,而for嵌套则是 n^2 复杂度。

    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号