Search code examples
rweb-scrapingrvest

Scrape <ul> with corresponding <p> tag


I have the following html snipped:

      <div class="main--content">
    <p> <strong>Ihre Aufgaben:</strong> </p> 
        <ul> 
            <li>Zentraler Ansprechpartner für den gesamten Mitarbeiterlebenszyklus
            </li> 
            <li>Partnerschaft mit den Geschäftsbereichen, um innovative Lösungen für die Mitarbeitererfahrung zu implementieren und zu entwickeln
            </li> 
            <li>Beratung zur Nachfolgeregelung, Analyse der Talentpyramide und Aufbauempfehlungen
            </li> 
            <li>Unterstützung der Führungseffektivität durch die Bereitstellung von Analyseberichten und die Nutzung der aktuellen HR-Strategie
            </li> <li>Evaluierung von HR-Richtlinien und -Prozessen
            </li> 
            <li>Erstellen und Entwickeln neuer Aktivitäten zur Verbesserung des Mitarbeiterengagements
            </li> 
            <li>Sicherstellen, dass der HRBP-Bereich eng mit den Geschäfts- und HR-Stakeholdern verbunden ist
            </li>
            <li>Tätigkeit als Moderator und innovatives Teammitglied bei der Umsetzung globaler HR-Projekte
            </li> 
        </ul> 
    <p>Ihr Profil:</p> 
        <ul> 
            <li>Kaufmännische Ausbildung mit Weiterbildung als Eidg. Dipl. HR-Fachfrau/mann
            </li> 
            <li>Mehrjährige Berufserfahrung in einer ähnlichen Funktion
            </li> 
            <li>Effektive Präsentations- und Kommunikationsfähigkeiten
            </li>
        </ul>
  </div>

I want to extract the title, in this case whatever is written in the p tag and the corresponding list elements.

I can get the p and ul elements from this, but I am not able to dynamically give the structure. I work with rvest

Following chunk returns the list elements:

tmp %>% rvest::html_elements("ul > li")
[1] <li>Zentraler Ansprechpartner für den gesamten Mitarbeiterlebenszyklus</li>
[2] <li>Partnerschaft mit den Geschäftsbereichen, um innovative Lösungen für die Mitarbeitererfahrung zu implementieren und zu entwickeln</li>

And the titles:

tmp %>% rvest::html_elements("p")
[6] <p> <strong>Ihre Aufgaben:</strong> </p>
[7] <p>Ihr Profil:</p>

Is there a way to extract the list to a dataframe or list?


Solution

  • library(rvest)
    library(purrr)
    doc <- minimal_html('<div class="main--content">
        <p> <strong>Ihre Aufgaben:</strong> </p> 
            <ul> 
                <li>Zentraler Ansprechpartner für den gesamten Mitarbeiterlebenszyklus
                </li> 
                <li>Partnerschaft mit den Geschäftsbereichen, um innovative Lösungen für die Mitarbeitererfahrung zu implementieren und zu entwickeln
                </li> 
                <li>Beratung zur Nachfolgeregelung, Analyse der Talentpyramide und Aufbauempfehlungen
                </li> 
                <li>Unterstützung der Führungseffektivität durch die Bereitstellung von Analyseberichten und die Nutzung der aktuellen HR-Strategie
                </li> <li>Evaluierung von HR-Richtlinien und -Prozessen
                </li> 
                <li>Erstellen und Entwickeln neuer Aktivitäten zur Verbesserung des Mitarbeiterengagements
                </li> 
                <li>Sicherstellen, dass der HRBP-Bereich eng mit den Geschäfts- und HR-Stakeholdern verbunden ist
                </li>
                <li>Tätigkeit als Moderator und innovatives Teammitglied bei der Umsetzung globaler HR-Projekte
                </li> 
            </ul> 
        <p>Ihr Profil:</p> 
            <ul> 
                <li>Kaufmännische Ausbildung mit Weiterbildung als Eidg. Dipl. HR-Fachfrau/mann
                </li> 
                <li>Mehrjährige Berufserfahrung in einer ähnlichen Funktion
                </li> 
                <li>Effektive Präsentations- und Kommunikationsfähigkeiten
                </li>
            </ul>
      </div>')
    
    ## get all p and ul elements
    p_and_ul <- doc %>% html_elements("p,ul") 
    
    ## which of these elements are p elements?
    is_p <- p_and_ul %>% html_element("li") %>% is.na()
    
    ## for each ul element get the li children
    all_li <- map(p_and_ul[!is_p], ~ html_elements(.x, "li"))
    
    ## put all results togteher
    res <- vector("list", length(p_and_ul))
    res[is_p] <- map_chr(p_and_ul[is_p], as.character)
    res[!is_p] <- map(all_li, as.character)
    unlist(res)
    
    #  [1] "<p> <strong>Ihre Aufgaben:</strong> </p>"                                                                                                                
    #  [2] "<li>Zentraler Ansprechpartner für den gesamten Mitarbeiterlebenszyklus\n            </li>"                                                               
    #  [3] "<li>Partnerschaft mit den Geschäftsbereichen, um innovative Lösungen für die Mitarbeitererfahrung zu implementieren und zu entwickeln\n            </li>"
    #  [4] "<li>Beratung zur Nachfolgeregelung, Analyse der Talentpyramide und Aufbauempfehlungen\n            </li>"                                                
    #  [5] "<li>Unterstützung der Führungseffektivität durch die Bereitstellung von Analyseberichten und die Nutzung der aktuellen HR-Strategie\n            </li>"  
    #  [6] "<li>Evaluierung von HR-Richtlinien und -Prozessen\n            </li>"                                                                                    
    #  [7] "<li>Erstellen und Entwickeln neuer Aktivitäten zur Verbesserung des Mitarbeiterengagements\n            </li>"                                           
    #  [8] "<li>Sicherstellen, dass der HRBP-Bereich eng mit den Geschäfts- und HR-Stakeholdern verbunden ist\n            </li>"                                    
    #  [9] "<li>Tätigkeit als Moderator und innovatives Teammitglied bei der Umsetzung globaler HR-Projekte\n            </li>"                                      
    # [10] "<p>Ihr Profil:</p>"                                                                                                                                      
    # [11] "<li>Kaufmännische Ausbildung mit Weiterbildung als Eidg. Dipl. HR-Fachfrau/mann\n            </li>"                                                      
    # [12] "<li>Mehrjährige Berufserfahrung in einer ähnlichen Funktion\n            </li>"                                                                          
    # [13] "<li>Effektive Präsentations- und Kommunikationsfähigkeiten\n            </li>"