2013-06-29 5 views
0

мне нужно проанализировать данные с сайта: http://www.sarkari-naukri.in/jobs-by-qualification/b-tech/sub-centre-manager.htmlданных Разбор с использованием BeautifulSoup в питона

Большинство учебник для BeautifulSoup предназначены для синтаксического анализа ссылок, а не в углубленном разборе необходимых данных по ссылке.

Теперь я прошел через какой-то учебник BeautifulSoup модуль питона и написал этот скрипт для загрузки требуемой строки данных из

<div id="content_box"> 
     <div id="content" class="hfeed">... 

Script я использую:

from BeautifulSoup import BeautifulSoup 
import urllib2 

def main(): 
    url = "http://www.sarkari-naukri.in/jobs-by-qualification/b-tech/sub-centre-manager.html" 
    data = urllib2.urlopen(url).read() 
    bs = BeautifulSoup(data) 

    postdata = bs.find('div', {'id': 'content_box'}) 
    postdata= [s.getText().strip() for s in postdata.findAll('div', {'class':'scdetail'})] 

    fname = 'postdata.txt' 
    with open(fname, 'w') as outf: 
     outf.write('\n'.join(postdata)) 

if __name__=="__main__": 
    main() 

Но этот сценарий Безразлично» т выполнить то, что я ожидаю. Я хочу, чтобы получить пост данные в файл, как мудр:

Название: Вакансия Для Sub Center Manager В Национальном институте электроники и информационных технологий - Чандигарх

Sub Center Manager

Национальный институт электроники и информационных технологий

Адрес: NIELIT, Chandigarh SCO: 114-116 Сектор 17B

Почтовый индекс: 160017

города Чандигарх и так далее ....

Пожалуйста, помогите или предложить.

Благодаря

ответ

0

Это решение использует BeautifulSoup

import os 
import sys 

# Import System libraries 
import re 
import urllib2 

# Import Custom libraries 
from BeautifulSoup import BeautifulSoup, Tag 

job_location = lambda x: x.name == "div" and set([(u"id", u"content")]) <= set(x.attrs) 
job_title_location = lambda x: set([(u"class", u"schema_title"), (u"itemprop", u"title")]) <= set(x.attrs) 
organ_location = lambda x: set([(u"class", u"schema_hiringorganization"), (u"itemprop", u"name")]) <= set(x.attrs) 
details_key_location = lambda x: x.name == "div" and bool(re.search("s.*heading", dict(x.attrs).get(u"class", ""))) 

def coll_up(ilist,base=0,count=0): 
    ''' 
    Recursively collapse nested lists at depth base and above 
    ''' 
    tlist = [] 
    if(isinstance(ilist,list) or isinstance(ilist,tuple)): 
     for q in ilist: 
      tlist += coll_up(q,base,count+1) 
    else: 
     if(base > count): 
      tlist = ilist 
     else: 
      tlist = [ilist] 
    return [tlist] if((count != 0) and (base > count)) else tlist 

def info_extract(ilist, count=0): 
    ''' 
    Recursively walk a nested list and upon finding a non iterable, return its string 
    ''' 
    tlist = [] 
    if(isinstance(ilist, list)): 
     for q in ilist: 
      if(isinstance(q, Tag)): 
       tlist += info_extract(q.contents, count+1) 
      else: 
       extracted_str = q.strip() 
       if(extracted_str): 
        tlist += [extracted_str] 
    return [tlist] if(count != 0) else tlist 

def main(): 
    url = "http://www.sarkari-naukri.in/jobs-by-qualification/b-tech/sub-centre-manager.html" 
    data = urllib2.urlopen(url).read() 
    soup = BeautifulSoup(data) 

    job_tags = soup.findAll(job_location) 
    if(job_tags): 
     job_tag = job_tags[0] 
     job_title = info_extract(job_tag.findAll(job_title_location))[0] 
     organ = info_extract(job_tag.findAll(organ_location))[0] 
     details = coll_up(info_extract(job_tag.findAll(details_key_location)), 2) 

     combined_dict = dict([tuple(["Job Title:"] + job_title)] + [tuple(["Organisation:"] + organ)] + [tuple(detail) for detail in details]) 
     combined_list = [["Job Title:"] + job_title, ["Organisation:"] + organ] + details 
     postdata = [" ".join(x) for x in combined_list] 
     print postdata 

     fname = "postdata.txt" 
     with open(fname, "w") as outf: 
      outf.write("\n".join(postdata).encode("utf8")) 

if __name__=="__main__": 
    main() 
0

Ваша проблема заключается здесь: postdata.findAll('div', {'class': 'scdetail'}). Пока вы ищете div s, на странице есть span s. Изменение его на postdata.findAll('span', {'class': 'scdetail'}) приводит к непустому результату.

Пример одного из значений вы желающих прочитать:

<div class="scheading"> 
    "Pay Scale: " <span class="scdetail" itemProp="baseSalary">Rs. 15,000/-</span> 
</div> 
0

Это Pyparsing экстрактор подберут сращивание DIV/пролетных теги:

from pyparsing import makeHTMLTags, withAttribute, SkipTo 

""" 
sample: 
<div class="scheading">Postal Code: <span class="scdetail" 
    itemprop="postalCode">160017</span></div> 
""" 
div,divEnd = makeHTMLTags("div") 
span,spanEnd = makeHTMLTags("span") 
div.setParseAction(withAttribute(("class","scheading"))) 
span.setParseAction(withAttribute(("class","scdetail"))) 

patt = (div + SkipTo(span)("label") + span + SkipTo(spanEnd)("value") + 
      spanEnd + divEnd) 

attrs = {} 
for match in patt.searchString(html): 
    attrs[match.itemprop] = (match.label[0].strip(), match.value) 

from pprint import pprint 
pprint(attrs.items()) 

печатает:

[('skills', 
    ('Desired Skills:', 
    'Preference will be given to candidates having good knowledge of UNIX &amp; Visual FoxPro.')), 
('qualifications', 
    ('Qualifications:', 
    '\x91A\x92 level of DOEACC/PGDCA with 2 years experience. ')), 
('educationRequirements', 
    ('Educational Requirements:', 
    'B. E./B. Tech. (CS/IT/Electronics)/MCA/M. Sc. (CS/IT/Electronics)/\x91B\x92 level of DOEACC ')), 
('addressLocality', ('City', 'Chandigarh')), 
('addressRegion', ('State', 'Haryana and Punjab')), 
('streetAddress', ('Address:', 'NIELIT, Chandigarh SCO: 114-116 Sector 17B')), 
('postalCode', ('Postal Code:', '160017')), 
('baseSalary', ('Pay Scale:', 'Rs. 15,000/-'))]