You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动