2013-11-22 4 views
2

У меня есть сайт, на котором данные каждого человека хранятся в отдельном файле .HTML. Таким образом, существует 100 человек, чьи данные хранятся в 100 различных файлах .html. Но у всех одинаковая структура HTML.Webcraping из каталога файлов HTML с использованием BS4 и python

Ссылка на сайт http://www.coimbatore.com/doctors/home.htm.

Таким образом, если вы видите этот сайт, существует много категорий, а файлы ~all-doctors.html~ находятся в одном каталоге.

http://www.coimbatore.com/doctors/cardiology.htm

имеет связь 5 врачей. Если я нажму на любое имя врача, это займет

http://www.coimbatore.com/doctors/thatdoctorname .htm. Итак, все файлы находятся в одном каталоге/врачах/Если я не ошибаюсь. Итак, как мне очистить детали каждого врача?

Я планировал wget все файлы из этого http://www.coimbatore.com/doctors/ URL, сохранить локально и объединить в один файл, используя whole.htmljoin функцию в LINUX. Есть ли лучший способ?

UPDATE

letters = ['doctor1','doctor2'...] 
for i in range(30): 
    try: 
     page = urllib2.urlopen("http://www.coimbatore.com/doctors/{}.htm".format(letters[i])) 
    except urllib2.HTTPError: 
     continue 
    else: 
+0

Вам не нужно 'wget' и сохранять его локально. Помимо этого, что вы пробовали, чтобы очистить код? – Andy

+0

прямо сейчас, что я делаю, храня все имя врача в массиве и увеличивая его в URL-адресе. –

+0

обновил свой вопрос –

ответ

3

Один подход заключается в использовании :

Создание проекта:

scrapy startproject doctors && cd doctors 

Определить данные для загрузки (items.py):

from scrapy.item import Item, Field 

class DoctorsItem(Item): 
    doctor_name = Field() 
    qualification = Field() 
    membership = Field() 
    visiting_hospitals = Field() 
    phone = Field() 
    consulting_hours = Field() 
    specialist_in = Field() 

Создать паука.basic один, кажется, от чего прийти для выполнения этой задачи:

scrapy genspider -t basic doctors_spider 'coimbatore.com' 

Изменение не возвращать Request объект до каждой страницы с информацией врача:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from doctors.items import DoctorsItem 
from scrapy.http import Request 
from urlparse import urljoin 

class DoctorsSpiderSpider(BaseSpider): 
    name = "doctors_spider" 
    allowed_domains = ["coimbatore.com"] 
    start_urls = [ 
     'http://www.coimbatore.com/doctors/home.htm' 
    ] 


    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 

     for row in hxs.select('/html/body/center[1]/table[@cellpadding = 0]'): 
      i = DoctorsItem() 
      i['doctor_name'] = '|'.join(row.select('./tr[1]/td[2]//font[@size = -1]/text()').extract()).replace('\n', ' ') 
      i['qualification'] ='|'.join(row.select('./tr[2]/td[2]//font[@size = -1]/text()').extract()).replace('\n', ' ') 
      i['membership'] = '|'.join(row.select('./tr[3]/td[2]//font[@size = -1]/text()').extract()).replace('\n', ' ') 
      i['visiting_hospitals'] = '|'.join(row.select('./tr[4]/td[2]//font[@size = -1]/text()').extract()).replace('\n', ' ') 
      i['phone'] = '|'.join(row.select('./tr[5]/td[2]//font[@size = -1]/text()').extract()).replace('\n', ' ') 
      i['consulting_hours'] = '|'.join(row.select('./tr[6]/td[2]//font[@size = -1]/text()').extract()).replace('\n', ' ') 
      i['specialist_in'] = '|'.join(row.select('./tr[7]/td[2]//font[@size = -1]/text()').extract()).replace('\n', ' ') 
      yield i 

     for url in hxs.select('/html/body/center[3]//a/@href').extract(): 
      yield Request(urljoin(response.url, url), callback=self.parse) 

     for url in hxs.select('/html/body//a/@href').extract(): 
      yield Request(urljoin(response.url, url), callback=self.parse) 

Выполнить это нравится:

scrapy crawl doctors_spider -o doctors.csv -t csv 

Это создаст файл csv, например:

phone,membership,visiting_hospitals,qualification,specialist_in,consulting_hours,doctor_name 
(H)00966 4 6222245|(R)00966 4 6230143 ,,Domat Al Jandal Hospital|Al Jouf |Kingdom Of Saudi Arabia ,"MBBS, MS, MCh (Cardio-Thoracic)",Cardio Thoracic Surgery,,Dr. N. Rajaratnam 
210075,FRCS(Edinburgh) FIACS,"SRI RAMAKRISHNA HOSPITAL|CHEST CLINIC,COWLEY BROWN ROAD,R.S.PURAM,CBE-2","MD.,DPPR.,FACP",PULMONOLOGY/ RESPIRATORY MEDICINE,"9-1, 5-8",DR.T.MOHAN KUMAR 
+91-422-827784-827790,Member -IAPMR,"Kovai Medical Center & Hospital, Avanashi Road,|Coimbatore-641 014","M.B.B.S., Dip.in. Physical Medicine & Rehabilitation","Neck and Back pain, Joint pain, Amputee Rehabilitation,|Spinal cord Injuries & Stroke",9.00am to 5.00pm (Except Sundays),Dr.Edmund M.D'Couto 
+91-422-303352,*********,"206, Puliakulam Road, Coimbatore-641 045","M.B.B.S., M.D., D.V.",Sexually Transonitted Diseases.,5.00pm - 7.00pm,Dr.M.Govindaswamy 
... 
3

Этот код должен вам начать.

import urllib2 
from bs4 import BeautifulSoup 

doctors = ['thomas'] 
for doctor in doctors: 
    try: 
     page = urllib2.urlopen("http://www.coimbatore.com/doctors/{}.htm".format(doctor)) 
     soup = BeautifulSoup(page) 
    except urllib2.HTTPError: 
     continue 

    rows = soup.find("table", cellspacing=0).find_all('tr') 

    for row in rows: 
     cols = row.find_all('td') 
     print "%s: %s" % (cols[0].get_text().replace('\n', ' '), cols[1].get_text().replace('\n', ' ')) 

Он имеет выход

Name of Doctor: Dr.Thomas Alexander 
Qualification: M.D (Internal Medicine), D.M. (Cardiology) 
Fellowship & Membership: Fellow of Indian College of Cardiology Associate Fellow 
of American College of Cardiology 
Address of Clinic/Visiting Hospitals: Kovai Medical Center and Hospital, P.B.N 
o.3209, Avanashi Road, Coimbatore-641 014 
Telephone Number: +91-422-827784 
Consulting Hours:  8am - 5pm 
Specialist in: Senior Consultant and Interventional Cardiologist 

несколько нот, которые вы можете иметь дело с по-разному. Я заменил все переводы строк (\n) с пробелами, потому что код имеет странные разрывы строк так:

<td><b><font face="Arial,Helvetica"><font color="#0000FF"><font size=-1>Name 
of Doctor</font></font></font></b></td> 

Обратите внимание, что это заставляет разрыв между Name и of.

Если вы пытаетесь сделать из него CSV, скрипт можно легко изменить, чтобы вытащить только вторую ячейку в каждой строке.

+0

Да, я пробовал то же самое. Но сложная часть состоит в том, чтобы поместить все имена врачей в массив, для которого я должен щелкнуть по 100 страницам страниц –

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