Python向已索引列表追加值仅返回重复单值的问题如何解决
问题原因
- 全局累加的
strip列表逻辑错误:你将strip = []定义在页面遍历循环外,每次请求新页面都会往strip追加新内容,但代码固定取strip[0]也就是第一个页面的解析结果,因此所有存入的数据都是第一个页面的重复值。 - 你去掉
[0]后报错的原因:去掉[0]后操作的是strip这个列表对象,列表本身没有split方法,因此触发类型错误,问题本质不是[0]写法不对,而是不需要全局累积所有页面的文本内容。 - 代码存在语法错误:
storeit['hospital'].append(list_data[1::3][0][0)行缺少右括号,运行会直接抛出语法异常。
修正方案
将文本处理逻辑改为每个页面单独处理当前抓取到的内容,不需要跨页面累积文本,修正后代码如下:
import requests from bs4 import BeautifulSoup href_url = ['https://www.nhs.uk/Services/Trusts/Overview/DefaultView.aspx?id=103', 'https://www.nhs.uk/Services/Trusts/Overview/DefaultView.aspx?id=827'] storeit = {'phone':[],'hospital':[],'postcode':[],'link':[]} # 直接遍历链接列表,写法更简洁 for url in href_url: r = requests.get(url) soup = BeautifulSoup(r.content, 'lxml') # 先判断板块是否存在,避免后续调用属性报错 panel = soup.find('div',{'class':'panel-content'}) if not panel: continue codes = panel.find_all('p') for h in codes: cur_text = h.text.strip() if not cur_text: continue # 直接处理当前p标签的文本,不需要存入全局列表 list_data = [l.split(',') for l in cur_text.split('\n') if l] storeit['phone'].append(list_data[::4]) storeit['hospital'].append(list_data[1::3][0][0]) # 补全缺失的右括号 storeit['postcode'].append(list_data[2::3][0][3]) storeit['link'].append(list_data[3::3])
如果每个页面的panel-content板块下只有1个符合要求的p标签,可以去掉内层遍历循环,简化写法:
for url in href_url: r = requests.get(url) soup = BeautifulSoup(r.content, 'lxml') panel = soup.find('div',{'class':'panel-content'}) if not panel: continue codes = panel.find_all('p') if codes: cur_text = codes[0].text.strip() list_data = [l.split(',') for l in cur_text.split('\n') if l] storeit['phone'].append(list_data[::4]) storeit['hospital'].append(list_data[1::3][0][0]) storeit['postcode'].append(list_data[2::3][0][3]) storeit['link'].append(list_data[3::3])
内容的提问来源于stack exchange,提问作者Stackcans
相关产品推荐
相关产品推荐

