2016-02-17 4 views
2

Я ищу информацию о зарплате от спецификации работы в общем виде моды (с учетом множества способов оплаты зарплата может быть указана (с и без слово «зарплата» это предшествующего, с нашими без конечных нулей, диапазоны и т.д.)Вытягивание зарплаты из HTML-спецификаций работы различной структуры и обозначение зарплаты

Принимая три различных спецификации задания, я захватить 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 [ ]: 

  • В случае # 1, фактическая зарплата в другом <div>, и не получить взял на всех.
  • В случае № 2 зарплата обнаруживается, но (i) это диапазон, который нужно будет обрабатывать, и (ii) Есть символы валюты, отличные от ASCII (UK £).
  • В случае № 3 зарплата также обнаруживается, но (i) это диапазон, который необходимо будет обрабатывать, и (ii) Есть символы валюты, отличные от ASCII (UK £).
  • В случае, поскольку указанная зарплата указана, но слово «Зарплата» не упоминается, ничего не обнаруживается.

ли неразумно полагать, что, учитывая широкий разброс в дизайне страницы и в спецификации заработной платы, что один размер подходит всем (или один-размер-подходит больше всего) регулярное выражение или сочетание регулярных выражений может сделать Хитрость? Если нет, то как я буду строить его/их? Или, действительно, есть ли подход Python к этому, который может полагаться меньше на регулярное выражение?

ответ

1

Вот одна идея:

  • передать 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: £ 
------ 

Надеется, что это будет, по крайней мере, чтобы вы начали.

+0

Это один черт из регулярного выражения. Интересно, что BeautifulSoup удается обойти проблемы кодирования символов вокруг ** £ **. Это «html.parser» достигает этого? – Pyderman

+0

@Pyderman это фактически '.text' самого' ответа' и 'BeautifulSoup' :) – alecxe

Смежные вопросы