【问题标题】:How do you find all list items between two tags with BeautifulSoup?您如何使用 BeautifulSoup 找到两个标签之间的所有列表项?
【发布时间】:2014-01-29 04:26:04
【问题描述】:

例如,我想从下面的列表中仅拉出 Child1、Child2 和 Child3,它们位于 h3 的第一个实例之后和 h3 的下一个标记之前

<h3>HeaderName1<h3>
<ul class="prodoplist">
 <li>Parent</li>
 <li class="lev1">Child1</li>
 <li class="lev1">Child2</li>
 <li class="lev1">Child3</li>
  </ul>
  <h3>HeaderName2<h3>
   <ul class="prodoplist">
   <li>Parent2</li>
   <li class="lev1">Child4</li>
   <li class="lev1">Child5</li>
   <li class="lev1">Child6</li>
   </ul>

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    使用 findChildren 喜欢:

    for ul in soup.find_all('ul'):
        print 'ul start'
        for idx, li in enumerate(ul.findChildren('li')):
            if idx in range(3):
                print li
    

    输出:

    ul start
    <li>Parent</li>
    <li class="lev1">Child1</li>
    <li class="lev1">Child2</li>
    ul start
    <li>Parent2</li>
    <li class="lev1">Child4</li>
    <li class="lev1">Child5</li>
    

    但是,在大多数情况下,lxml and xpath 是一个更好的解决方案:

    from lxml import html
    doc = html.parse('input.html')
    print [ul.xpath('li[1] | li[2] | li[3]') for ul in doc.xpath('//ul')]
    

    【讨论】:

    • 你可以使用lxml作为beautifulsoup4的解析器。像这样使用:bs4.BeautifulSoup(response.text, 'lxml')
    【解决方案2】:

    这应该可以。

    import re
    from BeautifulSoup import BeautifulSoup
    html_doc = '<h3>HeaderName1</h3><ul class="prodoplist"><li>Parent</li><li class="lev1">Child1</li><li class="lev1">Child2</li><li class="lev1">Child3</li></ul>  <h3>HeaderName2</h3><ul class="prodoplist"><li>Parent2</li><li class="lev1">Child4</li><li class="lev1">Child5</li><li class="lev1">Child6</li></ul>'
    m = re.search(r'<h3>.*?<h3>', html_doc, re.DOTALL)
    s = m.start()
    e = m.end() - len('<h3>')
    target_html = html_doc[s:e]
    new_bs = BeautifulSoup(target_html)
    ul_eles = new_bs.findAll('ul', attrs={'class' : 'prodoplist'})
    for ul_ele in ul_eles:
        li_eles = new_bs.findAll('li', attrs={'class' : 'lev1'})
        for li_ele in li_eles:
            print li_ele.text
    

    【讨论】:

      【解决方案3】:
      import requests
      from BeautifulSoup import BeautifulSoup
      
      children = []
      
      url = "http://someurl.html"
      r = requests.get(url)
      bs = BeautifulSoup(r.text)
      for uls in bs.findAll('ul', 'prodoplist'):
          lis = uls.findAll('li', 'lev1')
          for li in lis:
              children.append(li.text)
      
      print children
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 2018-01-02
        • 2019-04-14
        • 2019-10-30
        • 1970-01-01
        • 2021-02-11
        • 2016-09-15
        相关资源
        最近更新 更多