用BeautifulSoup爬取JSE官网仅返回1条新闻,如何定位HTML标签获取多条内容
问题定位
- 你当前遍历的
div.view-content.row.row-flex是整个新闻区块的外层容器,整个页面该元素仅有1个,取[0:4]切片无意义,自然只能拿到1条数据 - 原代码存在多处语法错误:headers格式错误、requests调用拼写错误、选择器参数缺逗号/引号未闭合、属性获取方法调用错误
- 未正确传递请求头,存在被网站反爬拦截返回不完整页面的可能
修复后可批量抓取的代码
from bs4 import BeautifulSoup import requests # 正确格式的请求头,避免反爬 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36' } # 请求页面,传入请求头 source = requests.get('https://www.jse.co.za/', headers=headers).text soup = BeautifulSoup(source, 'lxml') # 直接定位所有新闻卡片元素,取前4条 for item in soup.find_all('div', class_='card')[:4]: # 提取标题 text = item.find('h3', class_='card__title').text.strip() # 提取图片链接,拼接域名得到完整url img = item.find('img', class_='media__image') img_url = 'https://www.jse.co.za' + img['data-src'] # 提取文章链接,拼接域名得到完整url link = item.find('a') article_link = 'https://www.jse.co.za' + link['href'] print('Article Headline') print(text) print('IMAGE URL') print(img_url) print('LINK TO ARTICLE') print(article_link) print()
调整说明
- 遍历对象改为所有新闻对应的
div.card元素,直接取前4条即可拿到4条新闻数据 - 修正了所有语法错误,请求头按要求格式传入,降低反爬拦截概率
- 对相对路径的图片、文章链接拼接了主域名,返回的是可直接访问的完整URL
内容的提问来源于stack exchange,提问作者coja56
相关产品推荐
相关产品推荐

