从不同结构和薪水符号的HTML作业规范中提取薪水

皮德曼

我希望以一种通用的方式从工作规范中获取薪资信息(考虑到可以指定薪资的多种方式(在有“ Salary”字样的情况下,有无“ 0”)等等。)

采取了三种不同的工作规范,我使用抓取了HTML urllib2,然后对grep“每种工资”一词执行了不区分大小写的初始操作结果差异很大(请注意Jupyter的贴子不够漂亮):

In [52]:

urllib2
Out[52]:
<module 'urllib2' from '/Users/Evan/anaconda/lib/python2.7/urllib2.pyc'>
In [82]:

情况1

reponse = urllib2_urlopen('http://apply.ovoenergycareers.co.uk/vacancies/453/cro-manager/london/')
In [83]:

content = reponse.read()
In [84]:

save_html('salarygrep1', content)
In [59]:

!grep -i salary salarygrep1.html
!grep -i salary salarygrep1.html
  <dt class="field_salary">Salary</dt>
  <dd class="value_salary">
In [86]:

with open('salarygrep1.html') as s:
    for line in s:
        if 'salary' in line.lower():
            print line
  <dt class="field_salary">Salary</dt>

  <dd class="value_salary">

In [79]:

情况#2

reponse = urllib2_urlopen('http://apply.ovoenergycareers.co.uk/vacancies/475/ovo-telesales-agent/bristol/')
In [80]:

content = reponse.read()
In [81]:

save_html('salarygrep2', content)
In [63]:

!grep -i salary salarygrep2.html
  <dt class="field_salary">Salary</dt>
  <dd class="value_salary">
    Salary: �18,000 + benefits & competitive commission scheme; OTE range: �20,500 - �30,000
In [87]:

with open('salarygrep2.html') as s:
    for line in s:
        if 'salary' in line.lower():
            print line
  <dt class="field_salary">Salary</dt>

  <dd class="value_salary">

    Salary: �18,000 + benefits & competitive commission scheme; OTE range: �20,500 - �30,000

In [88]:

情况#3

reponse = urllib2_urlopen('https://gs7.globalsuccessor.com/centrica02/tpl_centrica02.asp?s=4A515F4E5A565B1A&jobid=48490,2356610248&key=21798303&c=028859657862&pagestamp=dbykvxmmwfnblykbqc')
In [89]:

content = reponse.read()
In [90]:

save_html('salarygrep3', content)
In [67]:

!grep -i salary salarygrep3.html
!grep -i salary salarygrep3.html
<p id="igSoundBite"><em><div>Salary: &#163;28-&#163;38K depending on experience</div></em></p><h3 id="igJobDesc0">Job Description</h3><p><div>Assistant Product Development Manager </div>
In [95]:

with open('salarygrep3.html') as s:
    for line in s:
        if 'salary' in line.lower():
            print line
<p id="igSoundBite"><em><div>Salary: &#163;28-&#163;38K depending on experience</div></em></p><h3 id="igJobDesc0">Job Description</h3><p><div>Assistant Product Development Manager </div>

In [70]:

情况#4

reponse = urllib2_urlopen('http://jobs.emounlimited.com/senior-digital-project-manager/')
In [71]:

content = reponse.read()
In [72]:

save_html('salarygrep4', content)
In [94]:

!grep -i salary salarygrep4.html
In [92]:

with open('salarygrep4.html') as s:
    for line in s:
        if 'salary' in line.lower():
            print line
In [ ]:

  • 在第一种情况下,实际工资是不同的<div>,根本不会被收取。
  • 在情况2中,薪水确实被检测到,但是(i)这是一个需要处理的范围,并且(ii)存在非ASCII货币字符(英镑)。
  • 在情况3中,薪水也被检测到,但是(i)这是一个需要处理的范围,并且(ii)存在非ASCII货币字符(英镑)。
  • 在这种情况下,由于指定了薪水,但未提及“薪水”一词,因此什么也没发现。

认为在页面设计和薪水规范方面存在很大差异,是否相信一种尺寸适合所有(或一种尺寸适合最高级)的正则表达式或正则表达式的组合可能会奏效?如果没有,我将如何构建它/它们?还是确实,是否有Python方法可以减少对正则表达式的依赖?

ec

这是一个主意:

  • 通过传递页面的HTML BeautifulSoup
  • 获取body元素的文本(其余部分我们不感兴趣)
  • 使用正则表达式选择金额

代码:

# -*- coding: utf-8 -*-
import re

import requests
from bs4 import BeautifulSoup

urls = [
    "http://apply.ovoenergycareers.co.uk/vacancies/453/cro-manager/london/",
    "http://apply.ovoenergycareers.co.uk/vacancies/475/ovo-telesales-agent/bristol/",
    "https://gs7.globalsuccessor.com/centrica02/tpl_centrica02.asp?s=4A515F4E5A565B1A&jobid=48490,2356610248&key=21798303&c=028859657862&pagestamp=dbykvxmmwfnblykbqc",
    "http://jobs.emounlimited.com/senior-digital-project-manager/"
]

money_pattern = re.compile(ur"($|£)([0-9.,]+K?)(?:\s*-\s*(?:$|£)*([0-9.,]+K?)*)*")
for url in urls:
    soup = BeautifulSoup(requests.get(url).text, "html.parser")
    text = soup.body.text

    print("URL: " + url)
    for currency, amount1, amount2 in money_pattern.findall(text):
        if not amount1 and not amount2:
            continue

        if not amount2:
            print("Single amount found: %s, currency: %s" % (amount1, currency))
        else:
            print("Range found: %s - %s, currency: %s" % (amount1, amount2, currency) )
    print("------")

输出:

URL: http://apply.ovoenergycareers.co.uk/vacancies/453/cro-manager/london/
Range found: 40,000 - 50,000, currency: £
------
URL: http://apply.ovoenergycareers.co.uk/vacancies/475/ovo-telesales-agent/bristol/
Single amount found: 18,000, currency: £
Range found: 20,500 - 30,000, currency: £
------
URL: https://gs7.globalsuccessor.com/centrica02/tpl_centrica02.asp?s=4A515F4E5A565B1A&jobid=48490,2356610248&key=21798303&c=028859657862&pagestamp=dbykvxmmwfnblykbqc
Range found: 28 - 38K, currency: £
------
URL: http://jobs.emounlimited.com/senior-digital-project-manager/
Range found: 36 - 40,000, currency: £
------

希望这至少可以帮助您入门。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从字符串列表中提取薪水

来自分类Dev

找到最高和最低的薪水

来自分类Dev

使用importrange从不同的工作表中提取文本和特定文本的计数

来自分类Dev

使用Google表格中的数组公式从不同的行和列中提取值

来自分类Dev

BeautifulSoup 4:从不同的 ptag(s) 中提取多个标题和链接

来自分类Dev

Oracle SQL:查找最高薪水和最低薪水之间差异最大的工作的工作ID

来自分类Dev

RxJava:如何从不同的函数中提取相同的observeOn?

来自分类Dev

从不同的数据集(字符)中提取重叠的名称

来自分类Dev

oracle数据库查询以获取月薪和总薪水

来自分类Dev

如何过滤各个部门的最低和最高薪水?

来自分类Dev

如何过滤各个部门的最低和最高薪水?

来自分类Dev

pandas DataFrame和pandas.groupby计算薪水

来自分类Dev

从结构中提取和组织价值

来自分类Dev

列出薪水相同的员工

来自分类Dev

查询以找到员工的薪水

来自分类Dev

选择最后的薪水

来自分类Dev

需要帮助以使用Java从emp.csv获得最高薪水和第二最高薪水

来自分类Dev

当表有重复的薪水时,使用子查询和deny_rank的第n个最高薪水不匹配

来自分类Dev

用R从非结构化文本文件中提取不同长度的数字(纬度和经度)

来自分类Dev

Openerp带薪水单的薪水单与python代码

来自分类Dev

我试图列出所有薪水高于平均薪水的导师姓名,并显示薪水比平均薪水高多少

来自分类Dev

从不同格式的相同字符串中提取数字/字符

来自分类Dev

根据某些条件从不同的pyspark列中提取所有匹配项

来自分类Dev

从不同的表格中提取动态日期范围后计算付款金额

来自分类Dev

使用R从不同位置的多个列中提取信息

来自分类Dev

Excel-从不同工作簿的某些表中提取数据

来自分类Dev

如何使用php从不同的数组中提取特定数据?

来自分类Dev

如何从不同的文件中提取特定的列并在一个文件中输出?

来自分类Dev

从不同工作簿中的单元格中提取超链接目标

Related 相关文章

  1. 1

    从字符串列表中提取薪水

  2. 2

    找到最高和最低的薪水

  3. 3

    使用importrange从不同的工作表中提取文本和特定文本的计数

  4. 4

    使用Google表格中的数组公式从不同的行和列中提取值

  5. 5

    BeautifulSoup 4:从不同的 ptag(s) 中提取多个标题和链接

  6. 6

    Oracle SQL:查找最高薪水和最低薪水之间差异最大的工作的工作ID

  7. 7

    RxJava:如何从不同的函数中提取相同的observeOn?

  8. 8

    从不同的数据集(字符)中提取重叠的名称

  9. 9

    oracle数据库查询以获取月薪和总薪水

  10. 10

    如何过滤各个部门的最低和最高薪水?

  11. 11

    如何过滤各个部门的最低和最高薪水?

  12. 12

    pandas DataFrame和pandas.groupby计算薪水

  13. 13

    从结构中提取和组织价值

  14. 14

    列出薪水相同的员工

  15. 15

    查询以找到员工的薪水

  16. 16

    选择最后的薪水

  17. 17

    需要帮助以使用Java从emp.csv获得最高薪水和第二最高薪水

  18. 18

    当表有重复的薪水时,使用子查询和deny_rank的第n个最高薪水不匹配

  19. 19

    用R从非结构化文本文件中提取不同长度的数字(纬度和经度)

  20. 20

    Openerp带薪水单的薪水单与python代码

  21. 21

    我试图列出所有薪水高于平均薪水的导师姓名,并显示薪水比平均薪水高多少

  22. 22

    从不同格式的相同字符串中提取数字/字符

  23. 23

    根据某些条件从不同的pyspark列中提取所有匹配项

  24. 24

    从不同的表格中提取动态日期范围后计算付款金额

  25. 25

    使用R从不同位置的多个列中提取信息

  26. 26

    Excel-从不同工作簿的某些表中提取数据

  27. 27

    如何使用php从不同的数组中提取特定数据?

  28. 28

    如何从不同的文件中提取特定的列并在一个文件中输出?

  29. 29

    从不同工作簿中的单元格中提取超链接目标

热门标签

归档