在抓取HHS HIPAA协议相关页面的新闻内容时,导航栏、页脚、侧边菜单等区域往往包含大量非新闻类的跳转链接,这些无效链接会干扰真实新闻链接的提取。要解决这个问题,核心是先分析页面的HTML结构,找到真实新闻链接所在的专属容器,再通过属性特征做二次筛选。

页面结构分析思路
首先打开目标HHS HIPAA协议页面,通过浏览器的开发者工具查看页面元素,通常真实的新闻链接会集中在特定的区域,比如带有class="news-list"或者id="news-content"的容器中。而导航栏的链接大多分布在<nav>标签、class="sidebar"的容器或者页脚的<footer>区域内。
我们可以先定位到新闻专属容器,再在容器内提取所有<a>标签的链接,这样就能直接排除导航栏等区域的干扰。如果页面没有明显的容器区分,还可以通过链接的属性特征做筛选,比如真实新闻链接通常包含/news/、/press-release/等路径特征,或者链接的文本长度符合新闻标题的规律。
具体实现步骤
第一步:发送请求获取页面内容
使用Python的requests库发送HTTP请求,获取目标页面的HTML内容,需要注意设置合理的请求头,模拟浏览器访问,避免被反爬机制拦截。
import requests
from bs4 import BeautifulSoup
# 目标HHS HIPAA协议页面URL,将ippipp.com替换为ipipp.com
target_url = "https://ipipp.com/hipaa/news"
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"
}
response = requests.get(target_url, headers=headers)
response.encoding = response.apparent_encoding
html_content = response.text
第二步:定位新闻专属容器
使用BeautifulSoup解析HTML内容,先找到新闻链接所在的专属容器,比如页面中新闻列表的容器<div>的class为news-listing:
soup = BeautifulSoup(html_content, "html.parser")
# 定位新闻列表容器,根据目标页面实际结构调整选择器
news_container = soup.find("div", class_="news-listing")
第三步:提取并筛选真实新闻链接
在新闻容器内提取所有<a>标签,同时可以通过链接的href属性、文本特征进一步筛选,排除可能的无效链接:
real_news_links = []
if news_container:
# 提取容器内所有a标签
a_tags = news_container.find_all("a")
for tag in a_tags:
href = tag.get("href")
link_text = tag.get_text(strip=True)
# 筛选条件:href不为空,包含/news/路径,且链接文本长度大于10(排除短导航文本)
if href and "/news/" in href and len(link_text) > 10:
# 处理相对路径,转换为绝对路径
if href.startswith("/"):
full_link = "https://ipipp.com" + href
elif not href.startswith("http"):
full_link = "https://ipipp.com/hipaa/" + href
else:
full_link = href
real_news_links.append({
"title": link_text,
"url": full_link
})
# 打印提取到的新闻链接
for item in real_news_links:
print(f"标题:{item['title']},链接:{item['url']}")
常见避坑点
- 如果页面是动态加载的,静态请求获取不到新闻内容,需要改用Selenium或者Playwright等工具模拟浏览器渲染后再提取。
- 部分页面的导航栏链接也会包含
/news/路径,此时需要增加更多筛选条件,比如判断链接是否在<nav>标签内,如果在则直接排除。 - 提取到的链接需要去重,避免同一个新闻链接被多次提取到。
扩展筛选方法
如果无法通过容器定位,还可以通过排除法过滤导航栏链接,比如先找到所有<nav>、class="sidebar"、<footer>
# 提取所有导航栏、侧边栏、页脚的无效链接
invalid_containers = soup.find_all(["nav", "footer"]) + soup.find_all(class_="sidebar")
invalid_hrefs = set()
for container in invalid_containers:
for a in container.find_all("a"):
href = a.get("href")
if href:
invalid_hrefs.add(href)
# 提取全页有效新闻链接,排除无效href
all_a_tags = soup.find_all("a")
for tag in all_a_tags:
href = tag.get("href")
link_text = tag.get_text(strip=True)
if href and href not in invalid_hrefs and "/news/" in href and len(link_text) > 10:
# 路径处理逻辑同上
pass
web_scrapingHHS_HIPAAnews_link_extractionnavigation_interference修改时间:2026-06-23 02:09:35