如何使用Regex + for loop从网址列表中下载多个csv文件?

时间:2019-01-29 21:29:31

标签: python regex beautifulsoup python-requests

我整天都在尝试下载一些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”

1 个答案:

答案 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())