Очистить библиотеку литературы с помощью rvest

#r #rvest

#r #rvest

Вопрос:

Я учусь rvest .

Я намерен очистить свои результаты поиска. Вот веб-страница,

https://pubmed.ncbi.nlm.nih.gov/?term=eliminat matrix effect HPLC-ms/msamp;filter=years.2013-2022amp;size=200

Я посмотрел вверх html_nodes() . На веб-странице нет того, что я видел.

Что я мог сделать?

Вот «тело».

 webpage %>% html_node('body')
{html_node}
<body>
 [1] <noscript>n  <div class="no-script-banner" id="no-script-banner">n    <div class="warning-message">n      <div class="warn ...
 [2] <div class="no-session-banner" id="no-session-banner" hidden>n  <div class="warning-message">n    <div class="warning-messa ...
 [3] <a class="usa-skipnav" href="#search-results">n    Skip to main page contentn  </a>
 [4] <div role="complementary" id="ncov-alert-from-server" class="ncbi-alerts nCoV_shutdown converted" style="display: block;" dat ...
 [5] <div class="usa-overlay"></div>
 [6] <header class="ncbi-header" role="banner" data-section="Header"><div class="usa-grid">ntt<div class="usa-width-one-whole"> ...
 [7] <div role="navigation" aria-label="access keys">n<a id="nws_header_accesskey_0" href="https://www.ncbi.nlm.nih.gov/guide/bro ...
 [8] <section data-section="Alerts"><div class="ncbi-alerts-placeholder"></div>n</section>
 [9] <a id="maincontent" aria-label="Main page content below" role="navigation"></a>
[10] <main class="search-page" id="search-page"><h1 class="usa-sr-only">Search Page</h1>n    n    nnnn<input type="hidden" n ...
[11] <div id="ncbi-footer">n      <div class="literature-footer" role="complementary" title="Links to NCBI Literature Resources"> ...
[12] <script src="https://cdn.ncbi.nlm.nih.gov/pubmed/0399d7a0-471a-4f7d-84af-66091af9d657/CACHE/js/output.293fbf76aa18.js"></script>
[13] <script src="https://cdn.ncbi.nlm.nih.gov/pubmed/0399d7a0-471a-4f7d-84af-66091af9d657/CACHE/js/output.29588445dbd9.js"></script>
[14] <script>n    ncbi.awesome.basePage.init({n      userInfo: {n        isLoggedIn: false,n        username: "",n        log ...
[15] <script type="text/javascript">n    jQuery.getScript("https://www.ncbi.nlm.nih.gov/core/alerts/alerts.js", function () {n   ...
[16] <script defer type="text/javascript" src="https://cdn.ncbi.nlm.nih.gov/core/pinger/pinger.js"> </script>
[17] <svg class="timeline-filter-gradient" xmlns="http://www.w3.org/2000/svg"><defs><lineargradient id="timeline-filter-selected-g ...
[18] <script src="https://cdn.ncbi.nlm.nih.gov/pubmed/0399d7a0-471a-4f7d-84af-66091af9d657/CACHE/js/output.714a700656e1.js"></script>
[19] <script>n    ncbi.awesome.searchPage.init({n      searchQuery: "eliminat matrix effect HPLC\u002Dms/ms",n      searchCons ...
Not 
 

Комментарии:

1. Вы пытаетесь вернуть результаты со всеми включенными этими терминами (т. Е. Все поисковые термины должны отображаться в результатах)? Где И / ИЛИ соответствуют вашим поисковым запросам? Кроме того, вы неправильно написали часть своего запроса и указаны ли предоставленные результаты для правильных поисковых запросов?

Ответ №1:

Мы можем получить заголовок результатов поиска с помощью

 library(rvest)
library(dplyr)
library(stringr)

url %>% read_html() %>% html_nodes('.docsum-title') %>% html_text() %>% str_remove_all('\n')

  [1] "                HPLC-MS/MS analysis of peramivir in rat plasma: Elimination of matrix effect using the phospholipid-removal solid-phase extraction method.              "                                                                                                                                             
  [2] "                Development of matrix effect-free MISPE-UHPLC-MS/MS method for determination of lovastatin in Pu-erh tea, oyster mushroom, and red yeast rice.
 

И ссылки на статьи по

 df = url %>% read_html() %>% html_nodes('.docsum-title') %>% html_attr('href') 

paste0('https://pubmed.ncbi.nlm.nih.gov', df)

  [1] "https://pubmed.ncbi.nlm.nih.gov/28976569/" "https://pubmed.ncbi.nlm.nih.gov/28410522/" "https://pubmed.ncbi.nlm.nih.gov/27491846/"
  [4] "https://pubmed.ncbi.nlm.nih.gov/31532096/" "https://pubmed.ncbi.nlm.nih.gov/31288535/" "https://pubmed.ncbi.nlm.nih.gov/29433096/"
 

Вы можете увидеть узел .docsum-title и ссылку рядом с ним.

введите описание изображения здесь

Комментарии:

1. Спасибо @Nad. каков процесс идентификации «.docsum-title» — это узел, в котором хранятся заголовки? Если мне нужна аннотация под каждой статьей, где я могу посмотреть?

2. Да, под узлом .docsum-title хранится заголовок. Если нам нужна аннотация, тогда у нас есть цикл по каждой ссылке, и под узлом .abstract-content selected хранится аннотация.

3. Спасибо, Над. Не могли бы вы рассказать мне, как я узнал, что заголовки хранятся в node .docsum-title?

4. Изменен ответ, чтобы включить изображение узла.

5. Спасибо, Над, я понял это, чтобы получить изображение, которым вы делитесь. Я в восторге от изучения таких инструментов веб-очистки, чтобы сэкономить мое время на поиске литературы.

Ответ №2:

Я бы подумал, правильно ли написаны ваши поисковые запросы, и хотите ли вы, чтобы И или ИЛИ между каждым термином соответствующим образом задавали ваш запрос. На основе их определения вы можете решить использовать общедоступные API, предоставляемые для применения вашего запроса, извлечения идентификаторов pubmed, а затем запросить связанные документы.

Руководство по API: https://www.ncbi.nlm.nih.gov/home/develop/api /

 library(jsonlite)
library(rvest)
library(tidyverse)

get_data <- function(link) {
  page <- read_html(link)
  data.frame(
    link = link,
    id = page %>% html_element('[title="PubMed ID"]') %>% html_text(trim = T),
    title = page %>% html_element(".heading-title") %>% html_text(trim = T),
    authors = page %>% html_elements(".full-name") %>% html_text(trim = T) %>% paste(., collapse = ', '),
    abstract = page %>% html_element("#enc-abstract") %>% html_text2()
  )
}

r <- jsonlite::read_json("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmedamp;retmax=200amp;retmode=jsonamp;term=eliminate AND matrix AND effect AND hplc ms/msamp;mindate=2013amp;maxdate=2022")
ids <- r$esearchresult$idlist

if(length(ids)>0){
  
  links <- sprintf("https://pubmed.ncbi.nlm.nih.gov/%s", ids)
  results <- map_dfr(links, get_data)
  
}
 

Комментарии:

1. Спасибо QHarr за то, что поделился кодами. Я получил кучу из шести статей. Мне интересно, почему я не могу получить 101 статью?

2. Потому что я использовал И для поиска только тех, которые содержат все условия поиска, что приводит к шести. Замена с помощью ORs приводит к гораздо большему количеству результатов. Я подозреваю, что в вашем первоначальном запросе есть несколько редакторов.

3. Взгляните на документы API относительно указания места поиска, поскольку вы можете выполнять поиск по конкретным / нескольким базам данных, а также по разным типам публикаций.

4. Я начал с языка, который знал очень хорошо, и буквально прошел через каждый вопрос StackOverflow, который смог найти. Я дополнил это видео на YouTube и чтением статей / блогов. Я подписался на несколько курсов, но обнаружил, что они, как правило, преподают плохие / плохие / устаревшие подходы IMO. Я расширил свои знания, читая и задавая вопросы на самых разных языках. Подходы не сильно меняются, только ограничения языка и синтаксиса / языковых идиом, поскольку чаще всего речь идет о понимании того, как обновляется / структурируется веб-страница

5. Для R я изучаю документацию, касающуюся пакетов, полагаюсь на существующие знания из других языков, изучая ответы, данные другими пользователями в R <insert web-scraping related tag here> Вам нужны базовые знания html / JavaScript и некоторое представление о современных веб-фреймворках. В моем профиле есть несколько ссылок.