使用BeautifulSoup获取Upwork职位发布时间返回None值的问题
解决Upwork职位发布时间获取返回None的问题
我来帮你排查下问题所在,主要有几个关键点需要调整:
1. BeautifulSoup的基础写法错误
首先你的代码里BeautifulSoup的导入和初始化存在问题,正确的写法应该是这样的:
from bs4 import BeautifulSoup # 初始化时必须指定HTML解析器,比如'lxml'或'html.parser' soup = BeautifulSoup(html, 'html.parser')
如果没正确导入库或者指定解析器,会直接导致元素选择逻辑异常。
2. 核心问题:静态请求拿不到动态渲染的内容
Upwork的职位列表是通过JavaScript动态加载的——你用urllib发送的静态请求只能获取到页面的初始骨架HTML,而实际的职位数据(包括<time>元素)是页面加载完成后通过AJAX请求拉取并渲染出来的,所以静态解析自然拿不到目标内容,最终返回None。
解决方案:用Selenium模拟浏览器加载
要获取动态渲染的内容,最靠谱的方式是用Selenium模拟真实浏览器的行为,等页面完全加载后再解析:
步骤1:安装依赖
先安装Selenium和对应浏览器的驱动(以Chrome为例):
pip install selenium
ChromeDriver需要和你的Chrome浏览器版本匹配,下载后可以放到系统PATH目录,或者在代码里指定驱动路径。
步骤2:完整可运行代码示例
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 from bs4 import BeautifulSoup # 初始化Chrome浏览器 driver = webdriver.Chrome() try: driver.get('https://www.upwork.com/o/jobs/browse/?q=scrap') # 等待职位卡片加载完成,最多等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'job-tile')) ) # 获取包含JS渲染内容的完整页面HTML html = driver.page_source soup = BeautifulSoup(html, 'html.parser') for job_tile in soup.select('.job-tile'): time_element = job_tile.select_one('time') if time_element: # 提取发布时间文本,也可以获取time标签的datetime属性值 publish_time = time_element.text.strip() print(f"职位发布时间:{publish_time}") else: print("当前职位未找到发布时间元素") finally: # 无论是否成功,最后都关闭浏览器 driver.quit()
额外提示
- Upwork有反爬机制,频繁请求可能会被限制,建议添加适当的请求延迟,或者使用代理IP
- 也可以尝试查找Upwork的公开API接口,通过API获取职位数据会更稳定,但需要注册开发者账号并遵守平台的API使用规则
内容的提问来源于stack exchange,提问作者Rashid Aziz




