该死的文本中包含纯文本,python,beautifulsoup"/>

首页 > 解决方案 > Python Bs4 不能在双跨该死的文本中包含纯文本

问题描述

嘿伙计们,所以我正在尝试抓取 Indeed 网站,到目前为止,除了薪水之外,一切都运行良好(当然是大声笑)。

所以我远不是请求、requests_html 和 bs4 方面的专家,所以在到处寻找一个小时后,我找不到我的特定问题的答案,所以我在这里......

我已经缩短了代码以使事情变得更容易(我会刮掉更多的东西)但是我已经让一个带有 .text 的跨度作为示例,它工作正常但只有一个跨度,而不是像薪水那样的跨度:

<div class="salarySnippet salarySnippetDemphasizeholisticSalary">
<span class="salary no-wrap">
<span class="salaryText">
1 900 € - 2 100 € par mois</span>
</span>
</div>

我是法国人,所以如果你想尝试自己去巴黎,Indeed 是法语版本,或者在输入中:

from bs4 import BeautifulSoup
import requests as req

print("_____Indeed Job Scaper_____")
city = str(input("Enter your city name here: "))

url = ("https://www.indeed.fr/emplois?l=" + city)
u_req = req.get(url)
soup = BeautifulSoup(u_req.content, 'html.parser')
job_elems = soup.find_all('div' , class_='jobsearch-SerpJobCard') 

for job_elem in job_elems:
    compagny_name = job_elem.find('span' , class_="company")
    salary = job_elem.find("span", {"class": "salaryText"})

    print(compagny_name.text)
    print(salary.text)

如果我不要求 print .text 关于薪水,我将得到:

<span class="salaryText">
1 800 € - 4 000 € par mois</span>

标签: pythonbeautifulsoup

解决方案


似乎并非每张卡都存在此salaryText跨度。因此,在您的循环中,您需要在访问它的内部文本之前检查跨度是否存在。

这是您的代码的更新版本:

from bs4 import BeautifulSoup
import requests as req

print("_____Indeed Job Scaper_____")
city = str(input("Enter your city name here: "))

url = ("https://www.indeed.fr/emplois?l=" + city)
u_req = req.get(url)
soup = BeautifulSoup(u_req.content, 'html.parser')
job_elems = soup.find_all('div' , class_='jobsearch-SerpJobCard') 

for job_elem in job_elems:
    compagny_name = job_elem.find('span' , class_="company")
    salary = job_elem.find("span", {"class": "salaryText"})

    print(compagny_name.text)

    # check if salary is not none, before accessing it's text property. 
    if salary: 
        print(salary.text)

你能告诉我它是否有效吗?


推荐阅读