我整天都在尝试下载一些csv文件,但是没有运气。 我有一个我希望脚本访问的URL列表,然后从一些锚点提取href属性,检查它是否与某些正则表达式模式匹配,然后将其下载到文件夹“ example.com / *。csv”
我使用的是macOs,python 3.7.2,我只在这台机器上尝试过它,但是一旦使它工作,我计划将其移动到Linux机器上。我从硒和geckodriver开始,然后发现我真的不需要它,可以通过BeautifulSoup +请求来实现。
就像我说的那样,我整天都在修改它,没有运气,这是最终版本,取自此处的另一个线程:
import requests
from bs4 import BeautifulSoup as bs
from urllib.request import urlopen
_URL = 'http://example.com/words'
_URLD = str(_URL.strip('words'))
# functional
r = requests.get(_URL)
soup = bs(r.text)
urls = []
names = []
for i, link in enumerate(soup.findAll('a')):
_FULLURL = _URLD + link.get('href')
if _FULLURL.endswith('.csv'):
urls.append(_FULLURL)
names.append(soup.select('a')[i].attrs['href'])
print(_FULLURL)
requests.get(_FULLURL)
使用我现在拥有的内容,我可以看到控制台会打印所有url,但是无法弄清楚在何处添加正则表达式模式,因此只能下载具有以下模式的url。
linkRegex = re.compile(r'/name-[0-9]+-[0-9]+-[0-9]+-[0-9]+.csv')
然后将csv文件实际写入“ example.com / *。csv”
答案 0 :(得分:1)
您可以将正则表达式匹配替换为'_FULLURL.endswith('。csv')'。使用urllib.urlretrieve()保存文件。例如,如果要保存到与python脚本位于同一目录中的名为“ example.com/”的文件夹:
import re
from bs4 import BeautifulSoup as bs
import urllib
_URL = 'http://example.com/words'
_URLD = str(_URL.strip('words'))
# functional
r = requests.get(_URL)
soup = bs(r.text)
urls = []
names = []
linkRegex = re.compile(r'/name-[0-9]+-[0-9]+-[0-9]+-[0-9]+.csv')
for i, link in enumerate(soup.findAll('a')):
_FULLURL = _URLD + link.get('href')
filename_match_obj = lingRegex.search(_FULLURL)
if filename_match_obj is not None:
urls.append(_FULLURL)
names.append(soup.select('a')[i].attrs['href'])
print(_FULLURL)
urllib.urlretrieve(_FULLURL, 'example.com' + filename_match_obj.group())