如果在 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
/except
和 append(None)
,但是 None
没有添加到列表中。因为列表的数量很重要。
我该怎么办?
注意 Check/print你的列表,不是None不会被追加,是你的“时间戳” " 最后缺少 - 根据您的示例
会发生什么?
- 主要问题是
re
模块没有导入(看你的例子)
- 这些不必要的列表理解使代码非常混乱并且更难调试。此外,如果没有
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': 'سلام مربوط به قلب نمی شود'},
...]
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
/except
和 append(None)
,但是 None
没有添加到列表中。因为列表的数量很重要。
我该怎么办?
注意 Check/print你的列表,不是None不会被追加,是你的“时间戳” " 最后缺少 - 根据您的示例
会发生什么?
- 主要问题是
re
模块没有导入(看你的例子) - 这些不必要的列表理解使代码非常混乱并且更难调试。此外,如果没有
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': 'سلام مربوط به قلب نمی شود'},
...]