找到下一个兄弟姐妹,直到某个人使用beautifulsoup

时间:2012-07-25 10:05:58

标签: python find beautifulsoup scrape siblings

网页是这样的:

<h2>section1</h2>
<p>article</p>
<p>article</p>
<p>article</p>

<h2>section2</h2>
<p>article</p>
<p>article</p>
<p>article</p>

如何在其中找到包含文章的每个部分?也就是说,在找到h2之后,找到nextsiblings

直到下一个h2。

如果网页如下:(通常就是这种情况)

<div>
<h2>section1</h2>
<p>article</p>
<p>article</p>
<p>article</p>
</div>

<div>
<h2>section2</h2>
<p>article</p>
<p>article</p>
<p>article</p>
</div>

我可以编写如下代码:

for section in soup.findAll('div'):
...
    for post in section.findAll('p')

但是如果我想获得相同的结果,我应该如何处理第一个网页呢?

2 个答案:

答案 0 :(得分:8)

我认为你可以这样做:

for section in soup.findAll('h2'):
    nextNode = section
    while True:
        nextNode = nextNode.nextSibling
        try:
            tag_name = nextNode.name
        except AttributeError:
            tag_name = ""
        if tag_name == "p":
            print nextNode.string
        else:
            print "*****"
            break

假设:

<h2>section1</h2>
<p>article1</p>
<p>article2</p>
<p>article3</p>

<h2>section2</h2>
<p>article4</p>
<p>article5</p>
<p>article6</p>

输出:

article1
article2
article3
*****
article4
article5
article6
*****

答案 1 :(得分:1)

next_siblings迭代器在这里也可能会有所帮助:

for i in soup.find_all('h2'):
    for sib in i.next_siblings:
        if sib.name == 'p':
            print(sib.text)
        elif sib.name == 'h2':
            print ("*****")
            break