使用Python的bs4爬取abafg站点新闻entry-title返回[],求错误排查
爬取abafg.it新闻的问题排查与解决
为啥返回[]?大概率是这两个坑
- 没加请求头被拦截:很多网站会把不带浏览器标识(User-Agent)的请求当成爬虫,返回空页面或非预期内容,自然解析不到目标元素
- 选择器定位不准确:你可能直接全局搜索
entry-title类,但实际上这个类嵌套在新闻专属的容器标签里,直接查找会匹配不到
正确爬取代码(含标题、链接、发布日期)
先模拟浏览器请求,再精准定位元素:
import requests from bs4 import BeautifulSoup # 目标地址 url = "https://www.abafg.it/category/avvisi/" # 模拟浏览器请求头,可替换为自己浏览器的UA headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 发送请求,避免被拦截 response = requests.get(url, headers=headers) response.encoding = "utf-8" # 防止中文乱码 # 解析页面 soup = BeautifulSoup(response.text, "html.parser") # 先定位最新新闻的容器(第一个带entry类的article标签) latest_news = soup.find("article", class_="entry") if latest_news: # 提取标题 title = latest_news.find("h2", class_="entry-title").get_text(strip=True) # 提取跳转链接 news_link = latest_news.find("h2", class_="entry-title").find("a")["href"] # 提取发布日期(datetime属性为标准格式,也可提取文本) publish_date = latest_news.find("time", class_="entry-date")["datetime"] # 若要显示友好日期文本,替换为:publish_date = latest_news.find("time", class_="entry-date").get_text(strip=True) print(f"标题:{title}") print(f"链接:{news_link}") print(f"发布日期:{publish_date}") else: print("未获取到新闻内容,请检查请求是否被拦截或页面结构是否变更")
重点提醒
- 必须添加User-Agent:这是最容易踩的坑,不加请求头大概率会被网站拦截,返回空内容
- 先找父容器再取子元素:直接查找
entry-title可能匹配到页面其他无关元素,先定位到新闻的article.entry容器,再提取内部元素精准度更高 - 若仍无结果,可先打印
response.text查看返回内容:如果是验证码或403页面,需进一步处理反爬(如添加Cookie、使用代理),但目前该站点仅需UA即可正常访问
内容的提问来源于stack exchange,提问作者Vito Esposito
相关产品推荐
相关产品推荐

