您如何使用 BeautifulSoup 查找两个标签之间的所有列表项?

Chr*_*ris 6 python beautifulsoup

例如,我只想从下面的列表中取出 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>
Run Code Online (Sandbox Code Playgroud)

Guy*_*ely 7

使用 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
Run Code Online (Sandbox Code Playgroud)

输出:

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>
Run Code Online (Sandbox Code Playgroud)

然而,在大多数情况下,lxml 和 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')]
Run Code Online (Sandbox Code Playgroud)