Home > database >  How to group selection by a specific parent -> child combination?
How to group selection by a specific parent -> child combination?

Time:10-12

I have an XML that consists of a <div> in which <div><head> occur. These <div><head> might or might not be followed by a <lb>. Ideally, I'd like a list of all <div><head/> ... </div>

<div><div><head facs="#facs_21_TextRegion_1624455438571_399">
            <lb facs="#facs_21_line_1624455438683_402" n="N001"/><supplied reason="article_added">7</supplied> Von der Liebe und guten wercken.</head>
            <p facs="#facs_21_TextRegion_1624455467191_408">
               <lb facs="#facs_21_r3l25" n="N001"/>Die Liebe, die da ist das ende des Gebots und die
               <lb facs="#facs_21_r3l26" n="N002"/>volkommenheyt des Gesetzs,<note type="annotation">Vgl. <ref type="biblical" cRef="Rm_13,8-10">Röm 13,8-10</ref>; <ref type="biblical" cRef="Gal_5,14">Gal 5,14</ref>.</note> so bald sie inn der
               <lb facs="#facs_21_r3l28" n="N003"/>rechtfertigung eintritt, so ist sie fruchtbar und
               <lb facs="#facs_21_r3l29" n="N004"/>beschleüsset inn sich selbs die samen aller guten werck,<note type="annotation">Vgl. <ref type="biblical" cRef="Ps_1,3">Ps 1,3</ref>.</note> <w>wel<pc>-</pc>
               <lb/><note place="margin-left" facs="#facs_21_r1">
               <lb/>Psalm. 1.</div> <div><head facs="#facs_21_TextRegion_1624455438571_399">
            <lb facs="#facs_21_line_1624455438683_402" n="N001"/><supplied reason="article_added">7</supplied> Von der Liebe und guten wercken.</head>
            <p facs="#facs_21_TextRegion_1624455467191_408">
               <lb facs="#facs_21_r3l25" n="N001"/>Die Liebe, die da ist das ende des Gebots und die
               <lb facs="#facs_21_r3l26" n="N002"/>volkommenheyt des Gesetzs,<note type="annotation">Vgl. <ref type="biblical" cRef="Rm_13,8-10">Röm 13,8-10</ref>; <ref type="biblical" cRef="Gal_5,14">Gal 5,14</ref>.</note> so bald sie inn der
               <lb facs="#facs_21_r3l28" n="N003"/>rechtfertigung eintritt, so ist sie fruchtbar und
               <lb facs="#facs_21_r3l29" n="N004"/>beschleüsset inn sich selbs die samen aller guten werck,<note type="annotation">Vgl. <ref type="biblical" cRef="Ps_1,3">Ps 1,3</ref>.</note> <w>wel<pc>-</pc>
               <lb/><note place="margin-left" facs="#facs_21_r1">
               <lb/>Psalm. 1.</div></div>

so I did print(soup.find_all('div')) which returns the list of all divs but removes the <head>:

<div>
<lb facs="#facs_21_line_1624455438683_402" n="N001"></lb><supplied reason="article_added">7</supplied> Von der Liebe und guten wercken.
            <p facs="#facs_21_TextRegion_1624455467191_408">
<lb facs="#facs_21_r3l25" n="N001"></lb>Die Liebe, die da ist das ende des Gebots und die
               <lb facs="#facs_21_r3l26" n="N002"></lb>volkommenheyt des Gesetzs,<note type="annotation">Vgl. <ref cref="Rm_13,8-10" type="biblical">Röm 13,8-10</ref>; <ref cref="Gal_5,14" type="biblical">Gal 5,14</ref>.</note> so bald sie inn der
               <lb facs="#facs_21_r3l28" n="N003"></lb>rechtfertigung eintritt, so ist sie fruchtbar und
               <lb facs="#facs_21_r3l29" n="N004"></lb>beschleüsset inn sich selbs die samen aller guten werck,<note type="annotation">Vgl. <ref cref="Ps_1,3" type="biblical">Ps 1,3</ref>.</note> <w>wel<pc>-</pc>
<lb></lb><note facs="#facs_21_r1" place="margin-left">
<lb></lb>Psalm. 1.</div>

I think some questions come up:

  1. How can I group my soup by

    <div><head>some tags and text ...</head>some more text</div>
    
  2. Why is the <head> vanishing?

CodePudding user response:

Behavior comes from the bs4 standard parser lxml in my opinion, so if you switch to html.parser you should see the <head>:

soup = BeautifulSoup(html,'html.parser')

You could use css selectors to chain your condition:

soup.select('div:has(>head)')

Example

from bs4 import BeautifulSoup

html = '''
<div><div><head facs="#facs_21_TextRegion_1624455438571_399">
<lb facs="#facs_21_line_1624455438683_402" n="N001"/><supplied reason="article_added">7</supplied> Von der Liebe und guten wercken.</head>
<p facs="#facs_21_TextRegion_1624455467191_408">
<lb facs="#facs_21_r3l25" n="N001"/>Die Liebe, die da ist das ende des Gebots und die
<lb facs="#facs_21_r3l26" n="N002"/>volkommenheyt des Gesetzs,<note type="annotation">Vgl. <ref type="biblical" cRef="Rm_13,8-10">Röm 13,8-10</ref>; <ref type="biblical" cRef="Gal_5,14">Gal 5,14</ref>.</note> so bald sie inn der
<lb facs="#facs_21_r3l28" n="N003"/>rechtfertigung eintritt, so ist sie fruchtbar und
<lb facs="#facs_21_r3l29" n="N004"/>beschleüsset inn sich selbs die samen aller guten werck,<note type="annotation">Vgl. <ref type="biblical" cRef="Ps_1,3">Ps 1,3</ref>.</note> <w>wel<pc>-</pc>
<lb/><note place="margin-left" facs="#facs_21_r1">
<lb/>Psalm. 1.</div> <div><head facs="#facs_21_TextRegion_1624455438571_399">
<lb facs="#facs_21_line_1624455438683_402" n="N001"/><supplied reason="article_added">7</supplied> Von der Liebe und guten wercken.</head>
<p facs="#facs_21_TextRegion_1624455467191_408">
<lb facs="#facs_21_r3l25" n="N001"/>Die Liebe, die da ist das ende des Gebots und die
<lb facs="#facs_21_r3l26" n="N002"/>volkommenheyt des Gesetzs,<note type="annotation">Vgl. <ref type="biblical" cRef="Rm_13,8-10">Röm 13,8-10</ref>; <ref type="biblical" cRef="Gal_5,14">Gal 5,14</ref>.</note> so bald sie inn der
<lb facs="#facs_21_r3l28" n="N003"/>rechtfertigung eintritt, so ist sie fruchtbar und
<lb facs="#facs_21_r3l29" n="N004"/>beschleüsset inn sich selbs die samen aller guten werck,<note type="annotation">Vgl. <ref type="biblical" cRef="Ps_1,3">Ps 1,3</ref>.</note> <w>wel<pc>-</pc>
<lb/><note place="margin-left" facs="#facs_21_r1">
<lb/>Psalm. 1.</div></div>
'''
soup = BeautifulSoup(html,'html.parser')

soup.select('div:has(>head)')

Output

[<div><head facs="#facs_21_TextRegion_1624455438571_399">
 <lb facs="#facs_21_line_1624455438683_402" n="N001"></lb><supplied reason="article_added">7</supplied> Von der Liebe und guten wercken.</head>
 <p facs="#facs_21_TextRegion_1624455467191_408">
 <lb facs="#facs_21_r3l25" n="N001"></lb>Die Liebe, die da ist das ende des Gebots und die
 <lb facs="#facs_21_r3l26" n="N002"></lb>volkommenheyt des Gesetzs,<note type="annotation">Vgl. <ref cref="Rm_13,8-10" type="biblical">Röm 13,8-10</ref>; <ref cref="Gal_5,14" type="biblical">Gal 5,14</ref>.</note> so bald sie inn der
 <lb facs="#facs_21_r3l28" n="N003"></lb>rechtfertigung eintritt, so ist sie fruchtbar und
 <lb facs="#facs_21_r3l29" n="N004"></lb>beschleüsset inn sich selbs die samen aller guten werck,<note type="annotation">Vgl. <ref cref="Ps_1,3" type="biblical">Ps 1,3</ref>.</note> <w>wel<pc>-</pc>
 <lb></lb><note facs="#facs_21_r1" place="margin-left">
 <lb></lb>Psalm. 1.</note></w></p></div>,
 <div><head facs="#facs_21_TextRegion_1624455438571_399">
 <lb facs="#facs_21_line_1624455438683_402" n="N001"></lb><supplied reason="article_added">7</supplied> Von der Liebe und guten wercken.</head>
 <p facs="#facs_21_TextRegion_1624455467191_408">
 <lb facs="#facs_21_r3l25" n="N001"></lb>Die Liebe, die da ist das ende des Gebots und die
 <lb facs="#facs_21_r3l26" n="N002"></lb>volkommenheyt des Gesetzs,<note type="annotation">Vgl. <ref cref="Rm_13,8-10" type="biblical">Röm 13,8-10</ref>; <ref cref="Gal_5,14" type="biblical">Gal 5,14</ref>.</note> so bald sie inn der
 <lb facs="#facs_21_r3l28" n="N003"></lb>rechtfertigung eintritt, so ist sie fruchtbar und
 <lb facs="#facs_21_r3l29" n="N004"></lb>beschleüsset inn sich selbs die samen aller guten werck,<note type="annotation">Vgl. <ref cref="Ps_1,3" type="biblical">Ps 1,3</ref>.</note> <w>wel<pc>-</pc>
 <lb></lb><note facs="#facs_21_r1" place="margin-left">
 <lb></lb>Psalm. 1.</note></w></p></div>]
  • Related