【问题标题】:How To download multiple csv files from a list of urls using Regex+ for loop?如何使用 Regex+ for 循环从 url 列表中下载多个 csv 文件?
【发布时间】:2019-01-29 21:29:30
【问题描述】:

我整天都在尝试下载一些 csv 文件,但没有成功。 我有一个我希望我的脚本访问的 url 列表,然后从一些锚点中提取 href 属性检查它是否匹配某些正则表达式模式并将它们下载到文件夹“example.com/*.csv”

我正在使用 macOs,python 3.7.2,我只在这台机器上尝试过,但一旦我让它工作,我计划将它移到 linux 机器上。我从 selenium 和 geckodriver 开始,然后我发现我真的不需要它,可以通过 BeautifulSoup + requests 来实现。

正如我所说,我整天都在修改它,但没有运气,这是最终版本,取自这里的另一个线程:

    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'

【问题讨论】:

  • 也许我没有得到这个问题:你在找print(linkRegex .search(_FULLURL).group(0))吗?

标签: python regex beautifulsoup python-requests


【解决方案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())

【讨论】:

  • 使用 VSCode 的调试器,似乎 filename_match_obj 永远不会通过条件,所以它总是 NONE 这里是截图:imgur.com/h7Qfoug
  • 你是对的。正如@Gsk 在评论中所说,正确使用的是“搜索”而不是“匹配”。代码已修复。
  • 是的! @Tim 成功了!!谢谢!谢谢!我要编辑一些错别字;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2023-03-25
  • 2019-08-04
  • 2018-07-16
  • 2013-03-21
  • 2018-12-14
相关资源
最近更新 更多