python - bs4怎么匹配紧跟div后面的li标签
高洛峰
高洛峰 2017-04-17 17:23:26
0
2
347
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()
      洪涛

      其实可以不用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 复杂度。

        最新下载
        更多>
        网站特效
        网站源码
        网站素材
        前端模板
        关于我们 免责声明 Sitemap
        PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!