【问题标题】:Navigating to next page using beautiful soup使用漂亮的汤导航到下一页
【发布时间】:2015-02-14 14:20:16
【问题描述】:

如何使用漂亮的汤来浏览结果的所有页面。例如我必须抓取这个网站:

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

搜索查询是
"((oncology) AND Breast cancer) AND 结果为"
不带引号。
如何获取所有页面?我尝试在请求标头中查看表单数据。尝试修改一些字段。我可以修改它以获得每页 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()

它仍然获取第一页。一旦这部分成功,我就会考虑迭代这段代码,每次都改变参数。

【问题讨论】:

  • 你应该添加你的代码
  • @PadraicCunningham 我已经添加了代码。
  • 您无法查看 'EntrezSystem2.PEntrez.PubMed.Pubmed_ResultsPanel.Entrez_Pager.CurrPage' : 4 并执行 xrange(1, n) 并使用结果而不是 4??
  • @akira 假设我只想看第 4 页。我目前没有迭代。只是试图获取具有给定页码的页面。
  • 您获取一页。如果你想获取更多:获取更多。我不明白你的问题。

标签: python beautifulsoup biopython


【解决方案1】:

永远不要抓取 PubMed —— 总有一种更简单的方法可以直接检索数据。安装并使用BioPython 包。这是一个使用查询获取前 10 篇论文的简单脚本:

from Bio import Entrez, Medline

# Always tell NCBI who you are  
Entrez.email = "your_address@example.com"  

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 解析结果的部分。

【讨论】:

  • 太棒了。还有一件事。我只需要摘要。如何从handle.read()中提取它
  • @user3286661 -- 我已经编辑了 sn-p 以包括使用 Medline 模块将返回的记录解析为 Python dicts
猜你喜欢
  • 2020-10-03
  • 1970-01-01
  • 2015-11-19
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2019-11-06
  • 1970-01-01
相关资源
最近更新 更多