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
?stringr
ne le sait pas. Quelle est la sortie destr (classes)
?@dario la sortie de str (classes) est
chr "