2015-02-14 3 views
1

Как использовать красивый суп для перемещения по всем страницам результата. Например, у меня есть, чтобы очистить этот сайт:Перемещение на следующую страницу с использованием красивого супа

http://www.ncbi.nlm.nih.gov/pubmed

Поисковый запрос является
«((онкология) и рак молочной железы) и в результате»
без кавычек.
Как получить все страницы? Я пробовал искать данные формы в заголовках запросов. Пробовал модифицировать некоторые поля. Я могу изменить его, чтобы получить 200 записей на страницу. Но не более того. Мне действительно нужно перебирать страницы, чтобы получить все. Любая помощь будет высоко оценена.

Предположим, что на данный момент я просто хотел посмотреть на 4-ю страницу.

Соответствующая часть кода:

post_params = { 
    'term' : val, 
     'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Pubmed_DisplayBar.PageSize' : 20, 
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Pubmed_DisplayBar.sPageSize' : 20, 
'coll_start' : 61, 
'citman_count' : 20, 
'citman_start' : 61, 
'coll_start2' : 61, 
'citman_count2' : 20, 
'citman_start2' : 61, 
'CollectionStartIndex': 1, 
'CitationManagerStartIndex' : 1, 
'CitationManagerCustomRange' : 'false', 

'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.cPage' : 3, 
'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.CurrPage' : 4, 

} 

"""This part handles the scraping business""" 
post_args = urllib.urlencode(post_params) 
baseurl = 'http://www.ncbi.nlm.nih.gov' 
url = 'http://www.ncbi.nlm.nih.gov/pubmed/' 
page = urllib2.urlopen(url, post_args) 
page = page.read() 
soup = BeautifulSoup(page) 
soup.prettify() 

Он по-прежнему получает первую страницу. Как только эта часть будет успешной, я думаю об итерации по этому коду, изменяя параметры каждый раз.

+0

Вы должны добавить свой код –

+0

@PadraicCunningham Я добавил код. – user3286661

+0

вы не можете посмотреть 'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.CurrPage ': 4' и сделать xrange (1, n) и использовать результат вместо 4 ?? – akira

ответ

2

Никогда не царапайте PubMed - всегда проще получить данные непосредственно. Установите и используйте пакет BioPython. Вот простой скрипт, чтобы получить первые 10 документов с помощью вашего запроса:

from Bio import Entrez, Medline 

# Always tell NCBI who you are 
Entrez.email = "[email protected]" 

term="((oncology) AND breast cancer) AND resulted in" 

handle = Entrez.esearch(db="pubmed", retmax=10, term=term) 
record = Entrez.read(handle) 

print record['Count'] # see how many hits in your search 

for ref in record['IdList']: 
    handle = Entrez.efetch(db="pubmed", id=ref, 
          rettype="Medline", 
          retmode="text") 
    paper = Medline.read(handle) 
    # Medline returns a dict from which we can extract the 
    # fields we desire 
    print '-' * 30 
    print paper['TI'] 
    print 
    print paper['AB'] 

Руководства обширно, но вам нужно только прочитать раздел о поиске и выборки записей с BioPython Entrez и анализа полученных результатов с BioPython Medline.

+0

Это было здорово. Еще кое-что. Мне просто нужен реферат. Как извлечь его из handle.read() – user3286661

+0

@ user3286661 - я отредактировал фрагмент, чтобы включить использование модуля Medline для анализа возвращаемых записей в Python dicts – gauden

Смежные вопросы