skip to Main Content

I am new to web scraping.
I am using the rvest package in R to scrape web content and I want to select paragraphs (

) that do not contain links ().

So far, I have not been very successful with this approach:

html <- read_html("https://www.news4teachers.de/2023/08/schaemt-euch-deutschland-steht-vor-den-vereinten-nationen-am-pranger-weil-es-die-inklusion-an-schulen-verweigert/")

html |>
  html_elements("article") |>
  html_elements("p") |>
  html_elements(":not(a)")

3

Answers


  1. You could select all the <p> tags and then filter them in R if they have any <a> tags. For example

    html |>
      html_elements("article") |>
      html_elements("p") |>
      Filter(function(x) {
        length(html_element(x, "a"))<1
      }, x=_)
    
    Login or Signup to reply.
  2. To get all the <p> tags which do not contain any <a> tags, you can use an xpath expression:

    html_elements(html, xpath = "//article/div/p[not(descendant::a)]") 
    #> {xml_nodeset (13)}
    #>  [1] <p>GENF. <strong>„Schämt Euch!“ – so heißt es auf einem Transparent, das ...
    #>  [2] <p><script charset="utf-8" async consent-original-src-_="https://platfor ...
    #>  [3] <p>Es ist fast schon dreist, wie Deutschland auf die offizielle Staatenp ...
    #>  [4] <p>Auch in einer gemeinsamen Stellungnahme von einem Bündnis deutscher N ...
    #>  [5] <p>„In keinem Bildungsbereich – von der Kita über Schule, Ausbildung und ...
    #>  [6] <p>Die Ausführungen der Bundesregierung im Staatenbericht, so heißt es w ...
    #>  [7] <p>Sonderpädagoginnen und -pädagogen würden immer noch weitestgehend für ...
    #>  [8] <p>Die Einführung inklusiver Bildung in Regelschulen sei von erheblichem ...
    #>  [9] <p><script charset="utf-8" async consent-original-src-_="https://platfor ...
    #> [10] <p><script charset="utf-8" async consent-original-src-_="https://platfor ...
    #> [11] <p>Der Rechtsanspruch auf inklusive Schulbildung sei in den meisten Bund ...
    #> [12] <p><iframe class="wp-embedded-content" sandbox="allow-scripts" security= ...
    #> [13] <p> </p>
    

    Created on 2023-09-21 with reprex v2.0.2

    Login or Signup to reply.
  3. Unfortunately it seems that the pseudo-class :has() is not supported by
    selectr/cssselect which are used by rvest for parsing css selectors.
    Otherwise something like this would work:

    # html |>
    #  html_elements("article") |>
    #  html_elements("p:not(:has(a))")
    

    We can work around this by converting the xml_nodelist to character and
    stringr::str_detect() which <p> elements have an <a> in them. Then we
    subset the xml_nodelist to only include those that don’t have link/<a> in
    them.

    library(rvest)
    library(stringr)
    
    html <-
      read_html(
        "https://www.news4teachers.de/2023/08/schaemt-euch-deutschland-steht-vor-den-vereinten-nationen-am-pranger-weil-es-die-inklusion-an-schulen-verweigert/"
      )
    
    all_p <-
      html |>
      html_elements("article") |>
      html_elements("p")
    
    has_link <- all_p |> as.character() |> str_detect("</a>")
    
    all_p[!has_link]
    #> {xml_nodeset (13)}
    #>  [1] <p>GENF. <strong>„Schämt Euch!“ – so heißt es auf einem Transparent, das ...
    #>  [2] <p><script charset="utf-8" async consent-original-src-_="https://platfor ...
    #>  [3] <p>Es ist fast schon dreist, wie Deutschland auf die offizielle Staatenp ...
    #>  [4] <p>Auch in einer gemeinsamen Stellungnahme von einem Bündnis deutscher N ...
    #>  [5] <p>„In keinem Bildungsbereich – von der Kita über Schule, Ausbildung und ...
    #>  [6] <p>Die Ausführungen der Bundesregierung im Staatenbericht, so heißt es w ...
    #>  [7] <p>Sonderpädagoginnen und -pädagogen würden immer noch weitestgehend für ...
    #>  [8] <p>Die Einführung inklusiver Bildung in Regelschulen sei von erheblichem ...
    #>  [9] <p><script charset="utf-8" async consent-original-src-_="https://platfor ...
    #> [10] <p><script charset="utf-8" async consent-original-src-_="https://platfor ...
    #> [11] <p>Der Rechtsanspruch auf inklusive Schulbildung sei in den meisten Bund ...
    #> [12] <p><iframe class="wp-embedded-content" sandbox="allow-scripts" security= ...
    #> [13] <p> </p>
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search