J'ai des difficultés à extraire certaines correspondances de mon vecteur de caractères que j'ai nommé classes à l'aide de la bibliothèque stringr :
> str_detect("</p><h2>STA 190XâSeminar (1-2)</h2>", "STA 190X")
[1] TRUE
> str_extract_all("</p><h2>STA 190XâSeminar (1-2)</h2>", "STA 190X")
[[1]]
[1] "STA 190X"
Un petit extrait de classes :
>str_detect(classes, "STA 190X") [1] FALSE >str_extract_all(classes, "STA 190X") [[1]] character(0)
Je peux clairement voir que le mot "STA 190X" est dans mon vecteur, mais je n'arrive pas à l'extraire:
...collaborative data analysis; complete case study review and team data analysis project. Effective: 2019 Fall Quarter.</p><h2>STA 190XâSeminar (1-2)</h2><p>Seminarâ1-2 hour(s). Prerequisite(s): STA 013 or STA 013Y or STA 032 or STA 100 or STA 103. In-depth examination of a special topic in a small group setting. Effective: 2018 Spring Quarter.</p><h2>STA 192âInternship in Statistics (1-12)</h2> <p>Internshipâ3-36 hour(s); Term Paper...
Mais si je copie et colle une section directement dans la fonction, cela fonctionne:
classes = read_lines("https://statistics.ucdavis.edu/courses/descriptions-undergrad") %>%
str_flatten()
Quelqu'un sait pourquoi? p>
3 Réponses :
Nous pouvons faire le traitement avec rvest et extraire les bons 'nœuds'
library(rvest)
library(stringr)
library(magrittr)
read_html("https://statistics.ucdavis.edu/courses/descriptions-undergrad") %>%
html_nodes("h2") %>%
html_text() %>%
str_c(collapse = ' ') %>%
str_extract(., "STAÂ 190X")
#[1] "STAÂ 190X"
J'ai copié votre code, mais ma sortie était "NA", pas "STA 190X"
@John Désolé, je ne peux pas le reproduire avec packageVersion ('rvest') [1] '0.3.4'> packageVersion ('stringr') [1] '1.4.0' sur R 3.6.2
Vous n'avez qu'à adapter un peu votre regex pour qu'elle corresponde non seulement à un espace, mais à tout ce qui n'est pas une lettre ou un nombre:
grepl("STA[^[:punct:]]*190X", classes)
C'est la chose la plus étrange:
"r.</p><h2>STA 190XâSeminar ("
Le code ci-dessus renvoie une correspondance de quelque chose qui ressemble à la chaîne 'STA 190X' mais ne l'est pas .
match_position <- gregexpr("STA[^ ]*190X", classes)[[1]][1]
substr(classes, match_position - 10, match_position + 17)
Cela ne peut pas être parce qu'il ne peut pas y avoir d'espace entre STA et 190X. S'il y avait eu un espace, le gregexpr ne l'aurait pas attrapé ( STA [^] * 190X correspond à tout ce qui ne correspond pas ont un (des) espace (s) entre STA et 190X)
Le tracé s'épaissit:
str_detect(classes, "STA[^A-z0-9]190X") [1] TRUE
Renvoie no match, ce qui, je pense, signifie que le personnage mystère est l'un des suivants:
[: punct:]
Caractères de ponctuation: ! "# $% & '() * +, -. /:; ? @ [\] ^ _` {|} ~.
L'espace blanc semble être un problème. Essayez d'utiliser \\ s pour les espaces et cela devrait fonctionner.
readr::read_lines("https://statistics.ucdavis.edu/courses/descriptions-undergrad") %>%
stringr::str_flatten() %>%
stringr::str_extract("STA\\s190X")
#[1] "STA 190X"
Ce que vous voyez à l'écran est différent de ce que votre ordinateur voit lorsqu'il télécharge la page via
read_lines(essayez de voir la source ou Ctrl + U dans votre navigateur). Cliquez avec le bouton droit sur la page et cliquez sur inspecter. Nous vous recommandons de réessayer avec quelque chose comme le packagervest.De quel package provient
read_lines?stringrne le sait pas. Quelle est la sortie destr (classes)?@dario la sortie de str (classes) est
chr "