2017-12-08 23 views
1

私はURLの複数のページを掻き回そうとしています。美しいスープで複数のページをこする

しかし、最初のページのみを掻き取ることができるのは、すべてのページを取得する方法です。

ここに私のコードです。

from bs4 import BeautifulSoup as Soup 
import urllib, requests, re, pandas as pd 

pd.set_option('max_colwidth',500) # to remove column limit (Otherwise, we'll lose some info) 
df = pd.DataFrame() 

Comp_urls = ['https://www.indeed.com/jobs?q=Dell&rbc=DELL&jcid=0918a251e6902f97', 'https://www.indeed.com/jobs?q=Harman&rbc=Harman&jcid=4faf342d2307e9ed','https://www.indeed.com/jobs?q=johnson+%26+johnson&rbc=Johnson+%26+Johnson+Family+of+Companies&jcid=08849387e791ebc6','https://www.indeed.com/jobs?q=nova&rbc=Nova+Biomedical&jcid=051380d3bdd5b915'] 

for url in Comp_urls: 
    target = Soup(urllib.request.urlopen(url), "lxml") 
    targetElements = target.findAll('div', class_ =' row result') 

    for elem in targetElements: 
     comp_name = elem.find('span', attrs={'class':'company'}).getText().strip() 
     job_title = elem.find('a', attrs={'class':'turnstileLink'}).attrs['title'] 
     home_url = "http://www.indeed.com" 
     job_link = "%s%s" % (home_url,elem.find('a').get('href')) 
     job_addr = elem.find('span', attrs={'class':'location'}).getText() 
     date_posted = elem.find('span', attrs={'class': 'date'}).getText() 
     description = elem.find('span', attrs={'class': 'summary'}).getText().strip() 


     comp_link_overall = elem.find('span', attrs={'class':'company'}).find('a') 
     if comp_link_overall != None: 
     comp_link_overall = "%s%s" % (home_url, comp_link_overall.attrs['href']) 
     else: comp_link_overall = None 

     df = df.append({'comp_name': comp_name, 'job_title': job_title, 
       'job_link': job_link, 'date_posted': date_posted, 
       'overall_link': comp_link_overall, 'job_location': job_addr, 'description': description 
       }, ignore_index=True) 


df 

df.to_csv('path\\web_scrape_Indeed.csv', sep=',', encoding='utf-8') 

とにかくありがとうございます。

+0

あなたは間違っています。 2番目の 'for'は、最初に'のために ' – furas

答えて

1

ケース1:ここで紹介するコードは、あなたが

Comp_urls = ['https://www.indeed.com/jobs?q=Dell&rbc=DELL&jcid=0918a251e6902f97', 'https://www.indeed.com/jobs?q=Harman&rbc=Harman&jcid=4faf342d2307e9ed','https://www.indeed.com/jobs?q=johnson+%26+johnson&rbc=Johnson+%26+Johnson+Family+of+Companies&jcid=08849387e791ebc6','https://www.indeed.com/jobs?q=nova&rbc=Nova+Biomedical&jcid=051380d3bdd5b915'] 

for url in Comp_urls: 
    target = Soup(urllib.request.urlopen(url), "lxml") 
    targetElements = target.findAll('div', class_ =' row result') 

for elem in targetElements: 

持って正確に何であるここでの問題は、ループの最初にあるすべての反復とtargetElements変化です。

for url in Comp_urls: 
    target = Soup(urllib.request.urlopen(url), "lxml") 
    targetElements = target.findAll('div', class_ =' row result') 

    for elem in targetElements: 

ケース2:最初にそうような内側のループのための第二の字下げ、これを回避する

あなたのバグが不適切なインデントの結果ではない(すなわち、あなたの中にあるものを好きではありません コードが正しく識別される場合は、targetElementsが空のリストである場合があります。つまり、target.findAll('div', class_ =' row result')は何も返しません。その場合は、サイトを訪問し、domをチェックしてから、スクレイピングプログラムを修正してください。

+0

の中に入っていなければなりません。 –

+0

あなたが現在掻きすることができないすべてのサイト。それらをリストで捉えて後で印刷することができます。最初の 'for'文の前に' unscraped = [] 'のようなものがあり、' targetElements = target.findAll( 'div'、class_ = '行結果') 'のすぐ後にあるものです。もしそうでなければ' targetElements:unscraped.append(url) ' –

+0

速い返事をいただきありがとうございます、私はあなたが示唆したように努力しており、サイトの最初のページのすべてのデータを取得していますが、どのようにすべてのページのデータを取得できますか? –

関連する問題