2013-11-22 1 views
1

Я работаю над программой, которая ищет что-то в Интернете с помощью xgoogle, а затем находит все файлы на сайтах результатов. У меня возникли проблемы с поиском всех файлов на веб-сайте. Я нашел question, который был похож, но я не мог заставить его работать. Вот код, который я использовал.Составьте список всех файлов на сайте

from bs4 import BeautifulSoup 
import requests 
def find_files(): 
    url = "http://www.python.org" 
    soup = BeautifulSoup(requests.get(url).text) 
    for a in soup.find('div', {'class': 'catlist'}).find_all('a'): 
     yield url + a['href'] 

Код не запускается, когда я его вызываю. Я поставил операторы печати в функцию, но ничего не происходит. Что мне делать, чтобы исправить это? Как эта функция может вернуть список всех файлов на веб-сайте?

+0

привет, что вы подразумеваете под «файлами на сайте»? Вы имеете в виду ссылки на страницах? – msturdy

+0

Я имею в виду файловую систему страницы. Например, результатом find_files («http://www.python.org») будет http://www.python.org/doc/, а также http://www.python.org/about/ и все другие каталоги и файлы, находящиеся в файловой системе сайта. – AHuman

+4

Ни один из них не является «файлами» или «каталогами». Это ссылки. –

ответ

3

Попробуйте это, чтобы вы начали ..

from bs4 import BeautifulSoup 
import requests 

def find_files(): 
    url = "http://www.python.org" 
    soup = BeautifulSoup(requests.get(url).text) 

    hrefs = [] 

    for a in soup.find_all('a'): 
     hrefs.append(a['href']) 

    return hrefs 

list_of_links = find_files() 

## show what you've found: 
for link in list_of_links: 
    print link 

Как вы видите, вы не можете просто добавить url ко всем результатам, так как некоторые из них являются для других сайтов, так что некоторые из результирующие URL-адреса не будут существовать ... вы должны принять решение о всех полученных вами хитах.

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

Если вы хотите, чтобы сделать это как генератор, следующее может быть полезным:

from bs4 import BeautifulSoup 
import requests 

def find_files(url): 

    soup = BeautifulSoup(requests.get(url).text) 

    for a in soup.find_all('a'): 
     yield a['href'] 

for link in find_files("http://www.python.org"): 
    print link 

note. Я переместил ваш url, чтобы сделать этот код более многоразовым.

+0

woah dude, python с открытым исходным кодом, так что это сайт * чистое оправдание * –

+0

@KDawG, да, но это просто кажется грубым, чтобы не проверить сначала :) – msturdy

1

Добавление его в список, вероятно, самый простой код для чтения, но python поддерживает способ получить список через итерацию только в одной строке кода. Этот пример должен работать:

my_list_of_files = [a['href'] for a in soup.find('div', {'class': 'catlist'}).find_all('a')] 

Это может заменить весь цикл цикла.

На боковой ноте это также работает немного быстрее, но это не должно быть проблемой. Это должно работать, считая, что данные, которые он выполняет, корректно и в правильном формате.

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

  • Нет связанных вопросов^_^