使用BeautifulSoup抓取Google News RSS源链接返回空如何解决
问题原因
- 正则匹配逻辑完全不匹配RSS结构:Google News返回的RSS是标准XML格式,新闻链接都存储在独立的
<link>标签内,不存在href="xxx"的属性结构,用匹配HTML链接的正则不可能匹配到内容。 - 待匹配的内容来源错误:
urlopen(req)返回的是HTTP响应字节流对象,直接调用str(html_page)得到的是该对象的内存地址字符串,而非RSS的实际内容,自然没有匹配结果。 - 搜索词处理逻辑错误:Google RSS的搜索参数要求URL编码,直接把空格替换为
-会导致搜索词无法被正确识别,甚至返回无效响应。 - 冗余逻辑冲突:已经引入了BeautifulSoup解析库,不需要再用正则做不稳定的内容匹配,直接用解析器提取标签内容即可。
修正后可运行代码
from urllib.request import urlopen, Request from urllib.parse import quote from bs4 import BeautifulSoup # 替换为你自己的搜索词列表 terms = ["人工智能", "climate change", "科技新闻"] for t in terms: # 搜索词URL编码,避免特殊字符、空格导致的请求错误 encoded_term = quote(t) raw_url = f"https://news.google.com/rss/search?q={encoded_term}&hl=en-US&gl=US&ceid=US:en" # 加UA头避免被Google反爬拦截 req = Request(raw_url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}) # 读取响应的实际RSS内容 rss_content = urlopen(req).read() # 用XML解析器处理RSS内容 soup = BeautifulSoup(rss_content, "xml") # 提取所有link标签的文本内容即为链接 all_links = [link.text for link in soup.find_all("link")] # 过滤掉第一个RSS源本身的链接,只保留新闻链接 news_links = all_links[1:] print(f"搜索词【{t}】抓取结果:") print(news_links)
注意事项
- 如果需要抓取中文内容,把URL里的
hl=en-US&gl=US&ceid=US:en替换为对应地区语言参数即可,比如中文区参数为hl=zh-CN&gl=CN&ceid=CN:zh - 控制请求频率不要太高,避免被Google临时封禁IP。
内容的提问来源于stack exchange,提问作者jimlearnscoding
相关产品推荐
相关产品推荐

