【问题标题】:Python Web Scraping DivPython Web Scraping Div
【发布时间】:2018-08-24 14:48:51
【问题描述】:

我正在尝试从网站上抓取工作列表,但我没有足够的抓取经验。 我发现所有工作都在这样的div 块中:

<div class="block_white_a post clearfix silver-job-block">

我要访问的是职位名称、职位描述和职位链接 (&lt;a href="..")。

很遗憾,我无法理解访问它们的逻辑。

到目前为止,我是这样提取它们的:

find_all("div", {"class":"block_white_a post clearfix "}

这是我的代码的link。

from bs4 import BeautifulSoup
from requests import get
from requests.exceptions import RequestException
from contextlib import closing
from bs4 import BeautifulSoup
import re

def simple_get(url):
#Attempts to get the content at `url` by making an HTTP GET request.
#If the content-type of response is some kind of HTML/XML, return the
#text content, otherwise return None
  try:
      with closing(get(url, stream=True)) as resp:
          if is_good_response(resp):
              return resp.content
          else:
              return None

  except RequestException as e:
      print('Error during requests to {0} : {1}'.format(url, str(e)))
      return None

def is_good_response(resp):

#Returns true if the response seems to be HTML, false otherwise

    content_type = resp.headers['Content-Type'].lower()
    return (resp.status_code == 200 
            and content_type is not None 
            and content_type.find('html') > -1)

raw_html = simple_get('http://www.keejob.com/offres-emploi/jobs/advanced/results/')
html = BeautifulSoup(raw_html, 'html.parser')


for item in html.find_all("div", {"class":"block_white_a post clearfix "}):
  print( item)
  print ("-----------------------------------------")
  print (str(item.get_text()).strip().join(' '))
  #Trying to get the description
  print ("-----------------------------------------")

【问题讨论】:

    标签: python regex web-scraping beautifulsoup python-requests


    【解决方案1】:

    我完全按照显示的顺序解析了以下内容:

    1. 职位名称
    2. 职位描述
    3. 职位链接

    代码:

    from bs4 import BeautifulSoup
    from requests import get
    from requests.exceptions import RequestException
    from contextlib import closing
    from bs4 import BeautifulSoup
    import re
    
    def simple_get(url):
    #Attempts to get the content at `url` by making an HTTP GET request.
    #If the content-type of response is some kind of HTML/XML, return the
    #text content, otherwise return None
      try:
          with closing(get(url, stream=True)) as resp:
              if is_good_response(resp):
                  return resp.content
              else:
                  return None
    
      except RequestException as e:
          print('Error during requests to {0} : {1}'.format(url, str(e)))
          return None
    
    def is_good_response(resp):
    
    #Returns true if the response seems to be HTML, false otherwise
    
        content_type = resp.headers['Content-Type'].lower()
        return (resp.status_code == 200
                and content_type is not None
                and content_type.find('html') > -1)
    
    raw_html = simple_get('http://www.keejob.com/offres-emploi/jobs/advanced/results/')
    soup = BeautifulSoup(raw_html, 'html.parser')
    divs = soup.find_all("div", {"class": "content row-fluid"})
    
    jobs = []
    for div in divs:
        job = []
        job.append(re.sub(r'\n\s*\n', r'\n\n', div.find('a').get_text().strip(), flags=re.M))
        try:
            job.append(re.sub(r'\n\s*\n', r'\n\n', div.find('div', {'class': 'span12 no-margin-left'}).find('p').get_text().strip(), flags=re.M))
        except AttributeError:
            job.append('No Job Description')
        job.append(div.find('a')['href'])
        jobs.append(job)
    
    for i in jobs:
        for l in i:
            print(l)
        print('\n')
    

    输出:

    Chef Unité Plastique
    Une société de renommée dans le milieu industriel recrute pour l'un de ses sites "Chef Unité Plastique"Mission:* Planifier et coordonner le travail, définir et répartir les postes de travail (méthodes ...
    /offres-emploi/jobs/view/64208/chef-unit%C3%A9-plastique/
    
    
    Chef D'équipe Production
    Nous recrutons pour le compte de notre client, une multinationale automobile de renommée sise à Sousse, Chef D'équipe ProductionMISSIONS:Organiser les différents îlots Superviser les teams leader productionSavoir atteindre les cadences Maîtriser parfaitement tout ...
    /offres-emploi/jobs/view/64207/chef-d%C3%A9quipe-production/
    
    
    Technicien Regleur
    Une Société de renommée dans le milieu industriel recrute pour l'un de ses sites un Technicien regleurMission * Montage et réglage des outillages et périphériques lors des changements de formats et/ou ...
    /offres-emploi/jobs/view/64206/technicien-regleur/
    
    
    Architecte d'intérieur
    No Job Description
    /offres-emploi/jobs/view/64205/architecte-dint%C3%A9rieur/
    
    
    Mouliste (Technicien Moule)
    Une société de renommée dans le milieu industriel recrute pour l'un de ses sites un Technicien MouleMission* Réaliser à l'unité ou en petite série les différentes pièces (coque, pont, ailerons, ...
    /offres-emploi/jobs/view/64204/mouliste-technicien-moule/
    
    
    ASSISTANTE COMMERCIAL
    No Job Description
    /offres-emploi/jobs/view/64203/assistante-commercial/
    
    
    Un Directeur Financier et Administratif (H/F)
    HR House International recrute pour l'un de ses clients, un groupe tunisien de renommé:Un Directeur Financier et Administratif (H/F) Principales missions:superviser la comptabilité et assurer les clôtures mensuelles et annuelles.établir les déclarations ...
    /offres-emploi/jobs/view/64202/un-directeur-financier-et-administratif-hf/
    
    
    CONSEILLERS EN IMMOBILIER SENIORS (H/F)
    No Job Description
    /offres-emploi/jobs/view/64201/conseillers-en-immobilier-seniors-hf/
    
    
    Assistant Moyens Généraux
    Microcred Tunisie, 8ème filiale du Groupe Microcred, souhaite recruter Un Assistant Moyens Généraux. Placé(e) sous la supervision directe du Responsable Moyens Généraux, le(a) candidat(e) évoluera dans un environnement exigeant, créatif et ...
    /offres-emploi/jobs/view/64199/assistant-moyens-g%C3%A9n%C3%A9raux/
    
    
    INGÉNIEUR MAINTENANCE INDUSTRIELLE
    No Job Description
    /offres-emploi/jobs/view/64198/ing%C3%A9nieur-maintenance-industrielle/
    
    
    Un (e) Stagiaire en Logistique
    No Job Description
    /offres-emploi/jobs/view/64197/un-e-stagiaire-en-logistique/
    
    
    Business Process Consultant EIMEA(Consultant SAP SD)
    No Job Description
    /offres-emploi/jobs/view/64196/business-process-consultant-eimeaconsultant-sap-sd/
    
    
    Coordinateur QHSE
    No Job Description
    /offres-emploi/jobs/view/64195/coordinateur-qhse/
    
    
    Directeur administratif (H/F)
    No Job Description
    /offres-emploi/jobs/view/64194/directeur-administratif-hf/
    
    
    MODELISTE
    No Job Description
    /offres-emploi/jobs/view/64193/modeliste/
    
    
    Auditeur comptable & Réviseurs
    No Job Description
    /offres-emploi/jobs/view/64191/auditeur-comptable-r%C3%A9viseurs/
    
    
    stagaire Assistance de direction et technique de commerce
    No Job Description
    /offres-emploi/jobs/view/64189/stagaire-assistance-de-direction-et-tache-commerciale/
    
    
    Manager   commercial
    Mission : Le manager commercial élabore des stratégies commerciales afin d’optimiser les résultats et d’agrandir voire de développer le réseau. Pour cela, il met en œuvre des plans d’actions commerciales, ...
    /offres-emploi/jobs/view/64188/manager-commercial/
    
    
    Responsable magasin zone sahel
    Missions-  Accueillir, conseiller et satisfaire le client,-  Organiser et piloter les activités en boutique,- Développer le chiffre d’affaire et atteindre les objectifs fixés,- Manager, animer et motiver l’équipe de vente,- ...
    /offres-emploi/jobs/view/64187/responsable-magasin-zone-sahel/
    
    
    RESPONSABLE FINANCIER
    No Job Description
    /offres-emploi/jobs/view/64181/responsable-financier/
    

    【讨论】:

    • 非常感谢,但你能向我解释一下吗:1/ job.append(re.sub(r'\n\s*\n', r'\n\n', div.find('a').get_text().strip(), flags=re.M)) 你到底要替换什么?我对正则表达式还不是很好。那是什么 flags=re.M
    • 基本上这整行正则表达式只是删除空格、换行符、制表符等。这是必要的,因为解析的文本将有许多不必要的空格和换行符,这使得可读性变得困难,也不会清理已解析的文本稍后与您的程序一起使用时,文本会使事情变得复杂,因此如果需要,最好只清理它。 re.M 标志用于多行匹配。
    • 最后一个忙,你能给我推荐一本好书或网站或任何参考资料,以了解有关使用 python 和正则表达式进行网络报废的更多信息。提前致谢
    • 不客气 :) 您可以查看book's 第二章,该章专门介绍正则表达式和 BeautifulSoup 解析。另请注意,如果您的目标是掌握正则表达式,这本书不会让您达到精通水平,但会让您很好地了解正则表达式的工作原理并为您打下良好的基础。
    猜你喜欢
    • 1970-01-01
    • 2023-02-11
    • 2015-08-25
    • 1970-01-01
    • 2018-04-02
    • 2017-09-06
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多