'Selecting second child using BeautifulSoup

Let's say I have the following HTML:

<div>
    <p>this is some text</p>
    <p>...and this is some other text</p>
</div>

How can I retrieve the text from the second paragraph using BeautifulSoup?



Solution 1:[1]

You can use nth-of-type:

h = """<div>
    <p>this is some text</p>
    <p>...and this is some other text</p>
</div>"""


soup = BeautifulSoup(h)

print(soup.select_one("div p:nth-of-type(2)").text)

Solution 2:[2]

secondp = [div.find('p') for div in soup.find('div')]

In : secondp[1].text

Out : Your text

Or you can use the findChildren directly -

div_ = soup.find('div').findChildren()
for i, child in enumerate(div_):
    if i == 1:
         print child.text

Solution 3:[3]

You could solve this with gazpacho:

from gazpacho import Soup

html = """\
<div>
    <p>this is some text</p>
    <p>...and this is some other text</p>
</div>
"""

soup = Soup(html)
soup.find('p')[1].text

Which would output:

'...and this is some other text'

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 hashcode55
Solution 3 emehex