首页 > 解决方案 > 使用 BeautifulSoup 在没有类名的范围内提取文本

问题描述

我正在尝试使用 BeautifulSoup 从求职网站中提取数据。我已经能够提取我需要的所有数据,但显示的薪水。

该网页是https://mx.indeed.com/jobs?q=operador&l=Ciudad%20de%20M%C3%A9xico

我遇到的问题是薪水在<span>没有班级名称或头衔的情况下。

示例 html 代码如下所示:

<div class="heading6 tapItem-gutter metadataContainer"><div class="metadata salary-snippet-container"><div aria-label="$12,000 al mes" class="salary-snippet"><span>$12,000 al mes</span></div></div></div>

我试过了:

salary = card.find("div", {"class" : "salary-snippet"}).find("span").text

但我收到以下错误:

AttributeError: 'NoneType' object has no attribute 'find'

谁能解释我如何解决这个问题?

标签: pythonhtmlweb-scrapingbeautifulsoup

解决方案


怎么了?

样本看起来很完美,但如果仔细观察,所有卡片中都没有薪水元素。

怎么修?

只需检查元素是否存在,然后在其上调用文本:

salary = card.select_one('div.salary-snippet').text if card.select_one('div.salary-snippet') else None

例子

import requests
from bs4 import BeautifulSoup

headers ={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}

r =requests.get('https://mx.indeed.com/trabajo?q=operador&l=Ciudad%20de%20M%C3%A9xico&vjk=970d586d3023d4d0')
soup=BeautifulSoup(r.content, 'lxml')

data = []

for card in soup.select('#mosaic-provider-jobcards a'):
    companyName = card.select_one('span.companyName').text if card.select_one('span.companyName') else None
    companyLocation = card.select_one('div.companyLocation').text if card.select_one('div.companyLocation') else None
    salary = card.select_one('div.salary-snippet').text if card.select_one('div.salary-snippet') else None
    
    data.append({
        'companyName':companyName,
        'companyLocation':companyLocation,
        'salary':salary
    })

data

只是想增加带薪工作吗?

data = []

for card in soup.select('#mosaic-provider-jobcards a'):
    companyName = card.select_one('span.companyName').text if card.select_one('span.companyName') else None
    companyLocation = card.select_one('div.companyLocation').text if card.select_one('div.companyLocation') else None
    salary = card.select_one('div.salary-snippet').text if card.select_one('div.salary-snippet') else None
    
    if salary:
        data.append({
            'companyName':companyName,
            'companyLocation':companyLocation,
            'salary':salary
        })

data

推荐阅读