Beautiful Soup перебирает HTML-тег

У меня есть следующий код в html

<section>
    <section>
        <h2>Title1</h2>
        <p>Text1</p>
        <p>Text1</p>
     </section>
  <section>
        <h2>Title2</h2>
        <p>Text2</p>
        <p>Text2</p>
     </section>
  <section>
        <h2>Title3</h2>
        <p>Text3</p>
        <p>Text3</p>
     </section>
  </section>
<section>
        <h2>Title2-1</h2>
        <p>Text2-1</p>
        <p>Text2-1</p>
</section>
<section>
        <h2>Title3-1</h2>
        <p>Text3-1</p>
        <p>Text3-1</p>
</section>
As in some sections have subsections and some don't. I want to grab the content of sub-sections and sections that don't have subsections I am trying to iterate over the subsections, so that I can create an Index in scrapy. I have following code for scrapy:

class RUSpider(BaseSpider):
name = "ru"
allowed_domains = ["http://127.0.0.1:8000/"]
start_urls = [
    "http://127.0.0.1:8000/week2/1_am/#/",
    "http://127.0.0.1:8000/week1/1/",
    "http://127.0.0.1:8000/week3/1_am/"
]
rules = [
    Rule(SgmlLinkExtractor(), follow=True)
]

def parse(self, response):

    filename = response.url.split("/")[3]
    hxs = HtmlXPathSelector(response)
    divs = hxs.select('//div')
    sections = divs.select('//section').extract()
   # print sections.extract


 #class definition for scrapy and html selector

    for each in sections: #iterate over loop [above sections]
        soup = BeautifulSoup(each)
        sp= soup.prettify()
        elements = soup.findAll("section".split())
        print len(elements),'sublength'
        if len(elements ) > 1:
            for element in elements:
                for subelement in element:
                    print subelement,'element'
        else:
            item = RItem() # create Index Item
            item['html_content'] = each
            print each
            yield item

Часть результата правильно отформатирована, хотя некоторые разделы без подразделов разбиваются на отдельные элементы.

Я хочу каждый раздел отдельно. Я имею в виду, так как 1 раздел имеет другие разделы. Я хочу перебрать эти разделы и получить их по отдельности, чтобы я мог отслеживать цикл. Поскольку некоторые разделы не имеют подразделов, нет необходимости их перебирать.

Есть ли лучший способ сделать это в BeautifulSoup? Я хочу следующий вывод

    <section>
        <h2>Title1</h2>
        <p>Text1</p>
        <p>Text1</p>
     </section>
  <section>
        <h2>Title2</h2>
        <p>Text2</p>
        <p>Text2</p>
     </section>
  <section>
        <h2>Title3</h2>
        <p>Text3</p>
        <p>Text3</p>
     </section>
 
    <section>
            <h2>Title2-1</h2>
            <p>Text2-1</p>
            <p>Text2-1</p>
    </section>
    <section>
            <h2>Title3-1</h2>
            <p>Text3-1</p>
            <p>Text3-1</p>
    </section>


person Mani    schedule 29.10.2014    source источник
comment
Вы хотите получить только те section, в которых есть теги h2, p? какой тип each здесь? это объект типа bs4.element.Tag? как ты получил sections?   -  person salmanwahed    schedule 29.10.2014
comment
Нет, я хочу каждый раздел отдельно. Я имею в виду, так как 1 раздел имеет другие разделы. Я хочу перебрать эти разделы и получить их по отдельности, чтобы я мог отслеживать цикл. Поскольку некоторые разделы не имеют подразделов, нет необходимости их перебирать.   -  person Mani    schedule 29.10.2014
comment
сделайте свою проблему минимальной, чтобы другие могли ее воспроизвести. и четко сформулируйте, чего вы на самом деле хотите.   -  person salmanwahed    schedule 29.10.2014
comment
Проверьте решение и дайте мне знать, помогло ли оно вам.   -  person salmanwahed    schedule 29.10.2014


Ответы (1)


Проверьте этот подход. Это общий из данных, которые вы предоставили.

data = """
<section>
    <section>
        <h2>Title1</h2>
        <p>Text1</p>
        <p>Text1</p>
     </section>
  <section>
        <h2>Title2</h2>
        <p>Text2</p>
        <p>Text2</p>
     </section>
  <section>
        <h2>Title3</h2>
        <p>Text3</p>
        <p>Text3</p>
     </section>
  </section>
<section>
        <h2>Title2-1</h2>
        <p>Text2-1</p>
        <p>Text2-1</p>
</section>
<section>
        <h2>Title3-1</h2>
        <p>Text3-1</p>
        <p>Text3-1</p>
</section>
"""
from bs4 import BeautifulSoup

soup = BeautifulSoup(data)

sections = soup.find_all('section')


for each in sections: #iterate over loop [above sections]
    if each.find('section'):
        continue
    else:
        print each.prettify()
person salmanwahed    schedule 29.10.2014