使用Beautiful Soup爬取含_ngcontent的内容时循环无返回怎么办?
爬取含_ngcontent标识的文本解决方案
问题分析
- 选择器写法错误:你写的
soup.findAll("label _ngcontent-lpf-c7", attrs={"class":"valor"})是错的,第一个参数应该是标签名(这里是label),_ngcontent-lpf-c7是Angular生成的动态属性,不是标签的一部分。 - _ngcontent是Angular的样式隔离标识,每次刷新页面都会随机变化,硬编码这个值肯定匹配不到元素。
- 如果内容在弹窗里,大概率是JavaScript动态加载的,
requests.get只能获取页面初始HTML,拿不到JS渲染后的弹窗内容。
解决方案
方案一:修正BeautifulSoup选择器(仅适用于内容已在初始HTML中)
不用管_ngcontent属性,直接匹配label标签且class为valor的元素:
from bs4 import BeautifulSoup as bs import requests url = 'https://formosodoaraguaia.megasofttransparencia.com.br/receitas-e-despesas/empenho?faseDoEmpenho=4&etapaDaDespesa=4&dataInicial=01%2F01%2F2019' page_to_scrap = requests.get(url) soup = bs(page_to_scrap.text, 'html.parser') # 匹配所有class为valor的label标签 data = soup.find_all("label", class_="valor") for item in data: print(item.text.strip())
方案二:用Selenium模拟浏览器渲染(处理动态加载的弹窗内容)
如果内容是点击后才弹出的动态内容,必须用Selenium模拟浏览器操作,等待弹窗加载完成后再抓取:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://formosodoaraguaia.megasofttransparencia.com.br/receitas-e-despesas/empenho?faseDoEmpenho=4&etapaDaDespesa=4&dataInicial=01%2F01%2F2019' # 初始化Chrome浏览器(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() driver.get(url) try: # 若需要点击按钮触发弹窗,先等待按钮可点击(替换成实际按钮的选择器) # trigger_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "触发弹窗的按钮选择器"))) # trigger_btn.click() # 等待弹窗中的目标元素加载完成,匹配class为valor的label labels = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "label.valor")) ) for label in labels: print(label.text.strip()) finally: driver.quit()
关键说明
- Angular的
_ngcontent属性是动态生成的,永远不要硬编码这个值,直接忽略它,通过元素的固定属性(比如class、文本特征)来定位。 - 动态加载的内容(弹窗、滚动加载等)必须用浏览器渲染工具(Selenium、Playwright等),因为
requests无法执行JavaScript,拿不到动态生成的DOM。
内容的提问来源于stack exchange,提问作者alexgatsby
相关产品推荐
相关产品推荐

