2016-10-13 10 views
0

findAllメソッドのパラメータを変更してliとidの両方を読み取るにはどうすればよいですか? liは要素であり、idは属性です。BeautifulSoupを使ってliとidを同じメソッドでスクラップします

#Author: David Owens 
#File name: soupScraper.py 
#Description: html scraper that takes surf reports from various websites 

import csv 
import requests 
from bs4 import BeautifulSoup 

###################### SURFLINE URL STRINGS AND TAG ########################### 

slRootUrl = 'http://www.surfline.com/surf-report/' 
slSunsetCliffs = 'sunset-cliffs-southern-california_4254/' 
slScrippsUrl = 'scripps-southern-california_4246/' 
slBlacksUrl = 'blacks-southern-california_4245/' 
slCardiffUrl = 'cardiff-southern-california_4786/' 

slTagText = 'observed-wave-range' 
slTag = 'id' 

#list of surfline URL endings 
slUrls = [slSunsetCliffs, slScrippsUrl, slBlacksUrl, slCardiffUrl] 

############################################################################### 


#################### MAGICSEAWEED URL STRINGS AND TAG ######################### 

msRootUrl = 'http://magicseaweed.com/' 
msSunsetCliffs = 'Sunset-Cliffs-Surf-Report/4211/' 
msScrippsUrl = 'Scripps-Pier-La-Jolla-Surf-Report/296/' 
msBlacksUrl = 'Torrey-Pines-Blacks-Beach-Surf-Report/295/' 

msTagText = 'rating-text text-dark' 
msTag = 'li' 

#list of magicseaweed URL endings 
msUrls = [msSunsetCliffs, msScrippsUrl, msBlacksUrl] 

############################################################################### 

''' 
This method iterates through a list of urls and extracts the surf report from 
the webpage dependent upon its tag location 

rootUrl: The root url of each surf website 
urlList: A list of specific urls to be appended to the root url for each 
    break 
tag:  the html tag where the actual report lives on the page 

returns: a list of strings of each breaks surf report 
''' 
def extract_Reports(rootUrl, urlList, tag, tagText): 
    #empty list to hold reports 
    reports = [] 
    #loop thru URLs 
    for url in urlList: 
     try: 
      #request page 
      request = requests.get(rootUrl + url) 

      #turn into soup 
      soup = BeautifulSoup(request.content, 'lxml') 

      #get the tag where report lives 
      reportTag = soup.findAll(id = tagText) 

      for report in reportTag: 
       reports.append(report.string.strip()) 

     #notify if fail 
     except: 
      print 'scrape failure' 
      pass 

    return reports 
#END METHOD 

slReports = extract_Reports(slRootUrl, slUrls, slTag, slTagText) 
msReports = extract_Reports(msRootUrl, msUrls, msTag, msTagText) 

print slReports 
print msReports 

現在のところ、slReportsはid = tagTextに明示的に設定されているため、正しく表示されます。私はまた、私のタグパラメタが現在使用されていないことを知っています。

答えて

0

問題は、クラス名がrating-textの要素のパーズツリーを検索したいということです(Magicseaweedの場合には、text-darkで関連要素を識別する必要はありません)。 findAll呼び出しを使用して、observed-wave-rangeを呼び出します。

あなたがこれを達成するためにfilter functionを使用することができます。そして、読むためにあなたのextract_Reports機能を変更

def reportTagFilter(tag): 
    return (tag.has_attr('class') and 'rating-text' in tag['class']) \ 
     or (tag.has_attr('id') and tag['id'] == 'observed-wave-range') 

を:

 reportTag = soup.findAll(reportTagFilter)[0] 
     reports.append(reportTag.text.strip()) 
+0

はどこにそのフィルタ機能は、私が現在持っているコードに行きますか? –

+0

待ち時間がなくなりました。私は、reportTagFilterがfindAll関数のパラメータにあることを認識しました –

関連する問題