如果在 beautifulsoup 中找不到元素,如何添加 return none

how to add return none if element not found in beautifulsoup

import requests
from bs4 import BeautifulSoup

respond_timestamp=[]
for i in range(17,18):
    print(i)
    try:
        url='https://www.darooyab.ir/doctor/9/دکتر-شهرام-مظاهری?page='+str(i)
        #print(url)
        response = requests.get(url).content.decode()
    except:
        continue
        
    soup = BeautifulSoup(response,'html.parser') 
    comment= soup.select('div.comment')
    #print( len(comment))
    
    for rt in [i for i in soup.select('div.comment')]:
        try:
            for out in [j.text for j in rt.select('div:nth-child(3) > span:nth-child(1) > label:nth-child(1)')]:
            #print(rt[1])
                pattern=r'دکتر شهرام مظاهری - متخصص قلب و عروق'
                respond_timestamp.append(re.sub(pattern,'',out)) 
        except:
            respond_timestamp.append(None)
            
print(len(respond_timestamp)) 

我想将 respond_timestamp 添加到列表中。 respond_timestamp 的返回值可能为空,然后我使用 try/exceptappend(None),但是 None 没有添加到列表中。因为列表的数量很重要。

我该怎么办?

注意 Check/print你的列表,不是None不会被追加,是你的“时间戳” " 最后缺少 - 根据您的示例

会发生什么?

  1. 主要问题是 re 模块没有导入(看你的例子)
  2. 这些不必要的列表理解使代码非常混乱并且更难调试。此外,如果没有 responseComment 则不会启动您的循环,因为它是一个空列表,这将使您的 try 成功并且不会导致异常。

如何修复?

导入 re 模块以避免异常并更改您的 for 循环 - Select 只有一个元素要检查您的 try:

for rt in soup.select('div.comment'):
    try:
        out = rt.select_one('div:nth-child(3) > span:nth-child(1) > label:nth-child(1)').text
        pattern= 'دکتر شهرام مظاهری - متخصص قلب و عروق'
        respond_timestamp.append(re.sub(pattern,'',out)) 
    except Exception as ex:
        print(repr(ex))
        respond_timestamp.append(None) 

例子

注意 如果您的目标是生成词典,请在整个过程中完成,而不是压缩多个列表,...

import requests
from bs4 import BeautifulSoup

data = []
for i in range(17,18):
    try:
        url='https://www.darooyab.ir/doctor/9/دکتر-شهرام-مظاهری?page='+str(i)
        response = requests.get(url).content.decode()
    except:
        continue

    soup = BeautifulSoup(response,'lxml') 

    for c in soup.select('.comment'):
        # pattern=r'دکتر شهرام مظاهری - متخصص قلب و عروق'
        # print(re.sub(pattern,'',c.select_one('div:nth-child(3) > span:nth-child(1) > label:nth-child(1)').text)) 
        data.append({
            'commentDate':c.span.text.split(' ')[1][1:-1],
            'commentText':c.div.text,
            'responseDate':responseDate.text.split(' ')[-1][1:-1] if (responseDate := c.select_one('.responseComment label')) else None,
            'responseText':responseText.text if (responseText := c.select_one('.responseComment .commentText')) else None,
        })

data

输出

[{'commentDate': '1398/12/29',
  'commentText': 'سلام من برای الرژیم قرص کیتوتیفن مصرف  میکنم  و برای تنفسم هم خیلی عالیه احساس میکنم ریه هام باز میشه توی دم و باز دم . آیا توی این مدت که این بیماری کرونا اومده استفاده از این دارو رو مشکل ساز است؟\r\n',
  'responseDate': None,
  'responseText': None},
 {'commentDate': 'راهان',
  'commentText': 'با سلام خدمت جناب آقای دکتر. ببخشید من به عل داشتن گواتر قرص لووتیروکسین سدیم 1 مصرف می کنم و تا الان شش کیلو وزن کم کردم . ممکنه راهنماییبفرمایید چکار کنم تا کاهش وزنم متوقف بشه. سپاسگزارم ',
  'responseDate': '1399/2/25',
  'responseText': 'سلام مربوط به قلب نمی شود'},
 {'commentDate': '1398/12/28',
  'commentText': 'سلام . من دیروز به دلیل درد معده و اسهال بیش از حد به پزشک مراجعه کردم . برای من سیپروفلوکساسین و دیفنوکسیلات تجویز کردن . مصرف که میکنم اسید معدم میاد تو دهانم . میخواستم بدونم مشکل از دارو هست یا بنده م',
  'responseDate': '1399/2/25',
  'responseText': 'سلام مربوط به قلب نمی شود'},
...]