解决爬虫中为某些项为空的情况
在我们平常爬取某个网站时,假设此网站内容排列整齐,例如这个论文网站。
我们可以看到,这个网站论文排列整齐。那么我们想要获得每个论文的标题,作者,摘要,pmid,doi这5项,如下图所示
那么对于第6篇论文,在它的里面摘要不存在,因此我们写的对于取这5项信息的爬虫代码会出现问题,下面附上问题代码及错误截图:
问题代码:
from bs4 import BeautifulSoup
import requests
from lxml import html
start_url = 'https://www.ncbi.nlm.nih.gov/pubmed/?term=Journal+of+medicinal+chemistry'
url = 'https://www.ncbi.nlm.nih.gov/pubmed/{}'
def get_Detail():
res = requests.get(start_url)
soup = BeautifulSoup(res.text,'html.parser')
for i in range(0,20):
pmid = soup.select('.rprtid')[i].text.lstrip('PMID:').strip()
each_url = url.format(pmid)
get_con(each_url)
def get_con(each_url):
res = requests.get(each_url)
tree = html.fromstring(res.content)
print("标题:")
title = tree.xpath('//h1/text()')
print(title[0],end='')
print("\n作者:")
auther = tree.xpath('//div[@class="auths"]/a/text()')
for auter in auther:
print(auter,end=",")
print("\n摘要:")
abstract = tree.xpath('//div[@class=""]/p/text()')
print(abstract[0],end="")
print("\nPMID:")
pmid = tree.xpath('//dl[@class="rprtid"]/dd/text()')
print(pmid[0],end="")
print("\nDOI:")
doi = tree.xpath('//dl[@class="rprtid"]/dd/a/text()')
print(doi[0])
get_Detail()
错误截图:
我们可以看出错误原因是数组越界,正是因为在第6篇论文中不存在摘要信息,而代码中缺乏判断是否为空的代码,因此,我们在上述代码中添加判断摘要为空的代码:
if abstract: #如果abstract存在,则打印摘要信息
print(abstract[0],end="")
else: #如果不存在,则不打印任何信息
仅仅这一小段代码,就可以完整的爬取20篇论文的详细信息了,而不会出现数组越界的问题了。(此文章为作者原创,如有雷同,纯属巧合)