Beautiful soup nested div recursive get text

Viewed 4670

I want the data which is there in the nested divs I'm unable to get it.

There are nested div I need the data to be properly formatted.

I have written the bs4 module but I got an Error

BeautifulSoup: AttributeError: 'NavigableString' object has no attribute 'name'

Kindly Help me!

My HTML

<div id="new">
    <div id="newDat">
        <div class="Data">
            <div class="DataNew">
                <div class="DataNew new">
                    <div class="Data Left">
                        <div class="name"><a class="name" href="">Jack Daniels</a></div>
                        <div class="details"><span class="loc">Barcelona</span></div>
                        <div class="header"><a class="looking"> Looking for meeting new people</a></div>
                        <div class="ideas"><a class="ideas">I have new ideas</a></div>
                        <div class="profile"> <em class="profilss"></em>MS in cs<br></div>

                    </div>
                    <div class="Data Right">
                        <a class="phone"><span class="txt">+123123123123123231</span></a>
                    </div>
                </div>

            </div>
        </div>
        <div class="DataOne">
            <div class="DataNew">
                <div class="DataNew new">
                    <div class="Data Left">
                        <div class="name"><a class="name" href="">Jack Daniels</a></div>
                        <div class="details"><span class="loc">Barcelona</span></div>
                        <div class="header"><a class="looking"> Looking for meeting new people</a></div>
                        <div class="ideas"><a class="ideas">I have new ideas</a></div>
                        <div class="profile"> <em class="profilss"></em>MS in cs<br></div>

                    </div>
                    <div class="Data Right">
                        <a class="phone"><span class="txt">+123123123123123231</span></a>
                    </div>
                </div>

            </div>
        </div>
        <div class="DataTwo">
            <div class="DataNew">
                <div class="DataNew new">
                    <div class="Data Left">
                        <div class="name"><a class="name" href="">Jack Daniels</a></div>
                        <div class="details"><span class="loc">Barcelona</span></div>
                        <div class="header"><a class="looking"> Looking for meeting new people</a></div>
                        <div class="ideas"><a class="ideas">I have new ideas</a></div>
                        <div class="profile"> <em class="profilss"></em>MS in cs<br></div>

                    </div>
                    <div class="Data Right">
                        <a class="phone"><span class="txt">+123123123123123231</span></a>
                    </div>
                </div>  
            </div>
        </div>
        <div class="DataThree">
            <div class="DataNew">
                <div class="DataNew new">
                    <div class="Data Left">
                        <div class="name"><a class="name" href="">Jack Daniels</a></div>
                        <div class="details"><span class="loc">Barcelona</span></div>
                        <div class="header"><a class="looking"> Looking for meeting new people</a></div>
                        <div class="ideas"><a class="ideas">I have new ideas</a></div>
                        <div class="profile"> <em class="profilss"></em>MS in cs<br></div>

                    </div>
                    <div class="Data Right">
                        <a class="phone"><span class="txt">+123123123123123231</span></a>
                    </div>
                </div>

            </div>
        </div>
    </div>
</div>

My Beautiful Soup Code

    li = page.find('div', {'id': 'new'})
    for tag in li:
        for i in tag.find_all("div", {"class": "name"}):
            print i.getText()
            break

        for i in tag.find_all("div", {"class": "details"}):
            print i.getText()
            break

        for i in tag.find_all("div", {"class": "header"}):
            print i.getText()
            break


        for i in tag.find_all("div", {"class": "ideas"}):
            print i.getText()
            break


        for i in tag.find_all("div", {"class": "profile"}):
            print i.getText()
            break

        for i in tag.find_all("div", {"class": "phone"}):
            print i.getText()
            break

I want the output like this

Div one 
Name : Jack Daniels
Details : Barcelona
header : Looking for meeting new people
ideas : I have new ideas
profile: MS in cs
tel : +123123123123123231

Div two 
Name : Jack Daniels
Details : Barcelona
header : Looking for meeting new people
ideas : I have new ideas
profile: MS in cs
tel : +123123123123123231

And so on.

If I have 100 Divs inside the <div id = "new"> I need the output like this.

1 Answers

You can do this. This will return data for every div.

from bs4 import BeautifulSoup
soup = BeautifulSoup(b) // b is html 
rows =soup.find_all('div', {'class': 'DataNew'})
for tag in rows:
    for tag in li:
    for i in tag.find_all("div", {"class": "name"}):
        print i.getText()
        break

    for i in tag.find_all("div", {"class": "details"}):
        print i.getText()
        break

    for i in tag.find_all("div", {"class": "header"}):
        print i.getText()
        break


    for i in tag.find_all("div", {"class": "ideas"}):
        print i.getText()
        break


    for i in tag.find_all("div", {"class": "profile"}):
        print i.getText()
        break

    for i in tag.find_all("div", {"class": "Data Right"}):
        print i.getText()
        break
Related