получить всю информацию от автора c - PullRequest
1 голос
/ 14 марта 2020

Здравствуйте, я пытаюсь получить все номера / pubmed /, которые связывают меня с рефератом статей, которые были написаны c автором. Проблема в том, что, когда я пытался это сделать, я получал одно и то же число снова и снова, пока не закончится l oop.

Нужно взять href, который я пытаюсь получить с выхода for line in lines l oop (спецификация c href приведена в примере вывода). То, что l oop, кажется, работает хорошо, но тогда for abstract in abstracts l oop только повторяют ту же самую ссылку.

Любое предположение или идею, что я упускаю или делаю неправильно. У меня нет большого опыта работы с bs4, поэтому, вероятно, я не очень хорошо использую библиотеку.

#Obtain all the papers of a scientific author and write its abstract in a new file

    from bs4 import BeautifulSoup

    import re

    import requests

    url="https://www.ncbi.nlm.nih.gov/pubmed/?term=valvano"
    response = requests.get(url)



    soup = BeautifulSoup(response.content, 'lxml')


    lines = soup.find_all("div",{"class": "rslt"})

    authors= soup.find_all("p",{"class": "desc"})

    scientist=[]

    for author in authors:
            #print('\n', author.text)
        scientist.append(author.text)
    s=[]
    for i in scientist:
        L=i.split(',')
        s.append(L)          


    n=0

    for line in lines:

        if ' Valvano MA' in s[n] or 'Valvano MA' in s[n] :
            print('\n',line.text)
#part of one output:
<a **href="/pubmed/32146294"** ...


            found = soup.find("a",{"class": "status_icon nohighlight"})
            web_abstract='https://www.ncbi.nlm.nih.gov{}'.format(found['href'])
            response0 = requests.get(web_abstract)
            sopa = BeautifulSoup(response0.content, 'lxml')
            abstracts = sopa.find("div",{"class": "abstr"})
            for abstract in abstracts:
                #print (abstract.text)


                print('https://www.ncbi.nlm.nih.gov{}'.format(found['href']))
#output: 
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31919170




            n=n+1

        else:

            n=n+1
#expected output:
https://www.ncbi.nlm.nih.gov/pubmed/32146294
https://www.ncbi.nlm.nih.gov/pubmed/32064693
https://www.ncbi.nlm.nih.gov/pubmed/31978399
https://www.ncbi.nlm.nih.gov/pubmed/31919170
https://www.ncbi.nlm.nih.gov/pubmed/31896348
https://www.ncbi.nlm.nih.gov/pubmed/31866961
https://www.ncbi.nlm.nih.gov/pubmed/31722994
https://www.ncbi.nlm.nih.gov/pubmed/31350337
https://www.ncbi.nlm.nih.gov/pubmed/31332863
https://www.ncbi.nlm.nih.gov/pubmed/31233657
https://www.ncbi.nlm.nih.gov/pubmed/31133642
https://www.ncbi.nlm.nih.gov/pubmed/30913267

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Это не должно быть так сложно. Просто используйте:

ids = soup.select('dt + dd')
for i in ids:
    pmid = i.text
    print(f'https://www.ncbi.nlm.nih.gov/pubmed/{pmid}')
1 голос
/ 14 марта 2020

Учитывая, что использование URL-адреса https://www.ncbi.nlm.nih.gov/pubmed/?term=valvano+MA возвращает правильные результаты, вы можете использовать следующий пример регулярного выражения.

from bs4 import BeautifulSoup
import re
import requests

url = "https://www.ncbi.nlm.nih.gov/pubmed/?term=valvano+MA"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'lxml')

for a in soup.select('div.rprt p a'):
    if re.match('^/pubmed/[0-9]*$', a['href']) is not None:
        print('https://www.ncbi.nlm.nih.gov{}'.format(a['href']))

Это позволит получить все 20 результатов плюс исправление для результата 17 Если вы не хотите, чтобы эта Erratum изменила строку 10 на

    if re.match('^/pubmed/[0-9]*$', a['href']) is not None and a.get('ref') is not None:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...