2017-02-13 1 views
0

Я просмотрел некоторые учебники и прочитал книгу об основах beautifulsoup, написал этот скребок, но не могу заставить его циклически перемещаться по URL-адресам a-z или просматривать страницы. Для этого проекта я очищаю веб-сайт. И я хочу, чтобы у него было царапины A-Z, а не только результаты страницы A.Как создать строки url в beautifulsoup

код ниже работал до тех пор, пока я пытался получить его для создания последней буквы строки -

Здесь НИЖЕ моя НЕ работает код - моя попытка построения строки URL. В идеале я хотел бы извлечь из файла или предопределенного списка, а также детские шаги.

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 
import os 
from string import ascii_lowercase 

def make_soup(url): 
thepage = urllib.request.urlopen(url) 
soupdata = BeautifulSoup(thepage, "html.parser") 
return soupdata 


playerdatasaved="" 
for letter in ascii_lowercase: 
soup = make_soup("http://www.basketball-reference.com/players/" + letter +  "/") 
    for record in soup.find_all("tr"): 
    playerdata="" 
    for data in record.findAll("td"): 
     playerdata=playerdata+","+data.text 
    if len(playerdata)!=0: 
     playerdatasaved = playerdatasaved + "\n" + playerdata[1:] 

header="Player,From,To,Pos,Ht,Wt,Birth Date,College" 
file = open(os.path.expanduser("Basketball.csv"),"wb") 
file.write(bytes(header, encoding="ascii",errors="ignore")) 
file.write(bytes(playerdatasaved, encoding="ascii",errors="ignore")) 

print(letter) 
print(playerdatasaved) 

МОИ ОШИБКИ НИЖЕ ---------------------

Traceback (most recent call last): 
File "C:/Python36/web_scraper_tutorial/multiple_url_2.py", line 15, in <module> 
soup = make_soup("http://www.basketball-reference.com/players/" + letter + "/") 
File "C:/Python36/web_scraper_tutorial/multiple_url_2.py", line 8, in make_soup 
    thepage = urllib.request.urlopen(url) 
File "C:\Python36\lib\urllib\request.py", line 223, in urlopen 
    return opener.open(url, data, timeout) 
    File "C:\Python36\lib\urllib\request.py", line 532, in open 
    response = meth(req, response) 
File "C:\Python36\lib\urllib\request.py", line 642, in http_response 
'http', request, response, code, msg, hdrs) 
File "C:\Python36\lib\urllib\request.py", line 564, in error 
    result = self._call_chain(*args) 
File "C:\Python36\lib\urllib\request.py", line 504, in _call_chain 
result = func(*args) 
File "C:\Python36\lib\urllib\request.py", line 756, in http_error_302 
return self.parent.open(new, timeout=req.timeout) 
File "C:\Python36\lib\urllib\request.py", line 532, in open 
response = meth(req, response) 
File "C:\Python36\lib\urllib\request.py", line 642, in http_response 
'http', request, response, code, msg, hdrs) 
File "C:\Python36\lib\urllib\request.py", line 570, in error 
return self._call_chain(*args) 
File "C:\Python36\lib\urllib\request.py", line 504, in _call_chain 
result = func(*args) 
File "C:\Python36\lib\urllib\request.py", line 650, in http_error_default 
raise HTTPError(req.full_url, code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 404: Not Found 

Любой дать мне некоторую помощь или совет ?

ниже рабочая версия только для одной страницы - мне нужно, чтобы она ползала по нескольким.

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 
import os 

def make_soup(url): 
thepage = urllib.request.urlopen(url) 
soupdata = BeautifulSoup(thepage, "html.parser") 
return soupdata 

playerdatasaved="" 
soup = make_soup("http://www.basketball-reference.com/players/a/") 
for record in soup.find_all("tr"): 
playerdata = "" 
for data in record.findAll("td"): 
    playerdata=playerdata+","+data.text 
playerdatasaved = playerdatasaved + "\n" + playerdata[1:] 

header="Player,From,To,Pos,Ht,Wt,Birth Date,College"+"\n" 
file = open(os.path.expanduser("Basketball.csv"),"wb") 
file.write(bytes(header, encoding="ascii",errors="ignore")) 
file.write(bytes(playerdatasaved, encoding="ascii",errors="ignore")) 


print(playerdatasaved) 
+0

ошибка говорит, что ответ с этим URL не найден, поэтому вы генерируете URL-адрес, недоступный на соответствующем сервере. – eLRuLL

+0

Я так понял, но можете ли вы сказать мне, почему? любой url с a-z должен быть действительным - что не так с тем, как у меня есть эта настройка? Я опубликовал первую версию сканирования одного URL-адреса - нужно несколько. – Drazziwac

+1

Я не могу сказать вам, почему сервер решает работать так, как планировал их программист. Также в вашем примере это выглядит так: «X» недоступен (404) – eLRuLL

ответ

0

Этот конкретный сайт не имеет «х». Таким образом, вы получите 404. Оберните его в попытке, за исключением того, что он пропустит страницы, которые являются 404, и он должен работать.

playerdatasaved="" 
for letter in ascii_lowercase: 
    try: 
     soup = make_soup("http://www.basketball-reference.com/players/" + letter +  "/") 
     for record in soup.find_all("tr"): 
     playerdata="" 
     for data in record.findAll("td"): 
      playerdata=playerdata+","+data.text 
     if len(playerdata)!=0: 
      playerdatasaved = playerdatasaved + "\n" + playerdata[1:] 
    except: 
     pass 
Смежные вопросы