我正在开发一个程序,使用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']
我打电话时代码没有运行。我已将print语句放在函数中,但没有任何反应。 我该怎么做才能解决这个问题?该函数如何返回网站中所有文件的列表?
答案 0 :(得分: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
添加到所有结果中,因为其中一些结果用于其他网站,因此某些结果网址将不存在...您应该采取你得到的所有命中的决定。
此外,请在运行此网站前查看网站有关网页抓取的政策
如果您想将此作为生成器执行此操作,则可能会使用以下内容:
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
注意 - 我已移动您的url
以使此代码更具可重用性。
答案 1 :(得分:1)
将它附加到列表中可能是最容易阅读的代码,但python确实支持通过迭代在一行代码中获取列表的方法。这个例子应该有效:
my_list_of_files = [a['href'] for a in soup.find('div', {'class': 'catlist'}).find_all('a')]
这可以替代整个for循环。
另一方面,这也有点快,但这应该不是问题。这应该有效,假设它迭代的数据是正确的并且格式正确。