beautifulsoup: find the n-th element's sibling

deostroll picture deostroll · Apr 10, 2010 · Viewed 7.8k times · Source

I have a complex html DOM tree of the following nature:

<table>
    ...
    <tr>
        <td>
            ...
        </td>
        <td>
            <table>
                <tr>
                    <td>
                        <!-- inner most table -->
                        <table>
                            ...
                        </table>

                        <h2>This is hell!</h2>
                    <td>
                </tr>
            </table>
        </td>
    </tr>
</table>

I have some logic to find out the inner most table. But after having found it, I need to get the next sibling element (h2). Is there anyway you can do this?

Answer

unutbu picture unutbu · Apr 10, 2010

If tag is the innermost table, then

tag.findNextSibling('h2')

will be

<h2>This is hell!</h2>

To literally get the next sibling, you could use tag.nextSibling, which in this case, is u'\n'.

If you want the next sibling that is not a NavigableString (such as u'\n'), then you could use

tag.findNextSibling(text=None)

If you want the second sibling (no matter what it is), you could use

tag.nextSibling.nextSibling

(but note that if tag does not have a next sibling, then tag.nextSibling will be None, and tag.nextSibling.nextSibling will raise an AttributeError.)