Python 如何使用Regex+;从URL列表下载多个csv文件;循环?
我一整天都在尝试下载一些csv文件,但运气不好。 我有一个我希望脚本访问的URL列表,然后从一些锚中提取href属性,检查它是否匹配某些正则表达式模式,并将它们下载到文件夹“example.com/*.csv”中 我正在使用macOs,Python3.7.2,我只在这台机器上试过,但一旦我成功了,我打算把它移到linux机器上。我从selenium和geckodriver开始,然后我发现我真的不需要它,可以通过BeautifulSoup+请求来实现 正如我所说,我已经修改了一整天,运气不好,这是最终版本,取自另一个线程:Python 如何使用Regex+;从URL列表下载多个csv文件;循环?,python,regex,beautifulsoup,python-requests,Python,Regex,Beautifulsoup,Python Requests,我一整天都在尝试下载一些csv文件,但运气不好。 我有一个我希望脚本访问的URL列表,然后从一些锚中提取href属性,检查它是否匹配某些正则表达式模式,并将它们下载到文件夹“example.com/*.csv”中 我正在使用macOs,Python3.7.2,我只在这台机器上试过,但一旦我成功了,我打算把它移到linux机器上。我从selenium和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,但无法确定在哪里添加regex模式,以便只能下载具有以下模式的URL
linkRegex = re.compile(r'/name-[0-9]+-[0-9]+-[0-9]+-[0-9]+.csv')
然后将csv文件实际写入“example.com/*.csv”您可以用正则表达式匹配替换检查“\u 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())
也许我没有得到这个问题:您是否正在寻找
打印(linkRegex.search(\u FULLURL.group(0))
?使用VSCode中的调试器,似乎文件名\u match\u obj从未通过该条件,所以它总是没有。这里是一个屏幕截图:您是对的。正如@Gsk在评论中所说,正确的用法是“搜索”,而不是“匹配”。代码已修复。是@蒂姆:成功了!!非常感谢。非常感谢。我要编辑一些打字错误;