Como posso wget de uma lista com várias linhas em um nome de arquivo?

1

Gostaria de obter uma lista de itens que estou recuperando de um arquivo XML. Estou usando o sed para limpar o XML e estou acabando com a saída assim:

CountofMonteCristo.zip
English.
http://www.archive.org/download/count_monte_cristo_0711_librivox/count_monte_cristo_0711_librivox_64kb_mp3.zip
Alexandre.
Dumas.
LettersofTwoBrides.zip
English.
http://www.archive.org/download/letters_brides_0709_librivox/letters_brides_0709_librivox_64kb_mp3.zip
Honoréde.
Balzac.
BleakHouse.zip
English.
http://www.archive.org/download/bleak_house_cl_librivox/bleak_house_cl_librivox_64kb_mp3.zip
Charles.
Dickens.

Gostaria de usar o wget -i para fazer o download desses arquivos Language.Lastname.Firstname.Title.zip

Estou aberto para reorganizar o arquivo de alguma forma para que eu possa usar $ filename $ url

Eu tentei alguns comandos sed diferentes. Sed é o que eu usei para limpar as tags XML, mas não consigo descobrir como mover o texto para o local apropriado. Os títulos, nomes e idiomas irão variar para cada arquivo.

EDIT: Antes de limpar as tags com sed, cada linha é agrupada em tags, como inglês e FileTitle. Eu acho que isso poderia ser útil na identificação de padrões para reorganizar as coisas.

EDIT2: Aqui está o XML fonte

EDIT3: Algo como este parece que funcionaria, mas estou tendo problemas para modificá-lo para atender às minhas necessidades.

Meu objetivo final é organizar todos os arquivos em pastas, com uma hierarquia de idiomas - > AutorLastnameFirstname - > Files.zip

Se o que estou fazendo não é uma prática recomendada, estou aberto a outros métodos.

Obrigado

    
por Matt Zabojnik 02.04.2018 / 19:25

3 respostas

1

If what I'm doing is not best practice, I'm open to other methods.

Eu sugiro que você não use bash ou sed etc.! E vá com uma maneira python, que é definitivamente uma maneira muito melhor de analisar o xml que você precisa analisar. Eu acabei de escrever e testar isso com o python3.6 e ele faz exatamente o que você pediu.

#!/usr/bin/python3
# Let's import the modules we need
import wget
import os
import requests
from bs4 import BeautifulSoup as bs

# Assign the url to a variable (not essential as we 
# only use it once, but it's pythonic)
url = 'https://librivox.org/api/feed/audiobooks/?offset=0&limit=3&fields=%7Blanguage,authors,title,url_zip_file%7B'

# Use requests to fetch the raw xml
r = requests.get(url)

# Use BeautifulSoup and lxml to parse the raw xml so 
# we can do stuff with it
s = bs(r.text, 'lxml')

# We need to find the data we need. This will find it and create some 
# python lists for us to loop through later

# Find all xml tags named 'url_zip_file' and assign them to variable
links = s.find_all('url_zip_file')

# Find all xml tags named 'last_name' and assign them to variable
last_names = s.find_all('last_name')

# Find all xml tags named 'last_name' and assign them to variable
first_names = s.find_all('first_name')

# Find all xml tags named 'language' and assign them to variable
language = s.find_all('language')

# Assign the language to a variable
english = language[0].text

# Make our new language directory
os.mkdir(english)

# cd into our new language directory
os.chdir(str(english))

# Loop through the last names (ln), first names(fn) and links
# so we can make the directories, download the file, rename the 
# file then we go back a directory and loop again
for ln, fn, link in zip(last_names, first_names, links):
    os.mkdir('Author{}{}'.format(str(ln.text), str(fn.text)))
    os.chdir('Author{}{}'.format(ln.text, fn.text))
    filename = wget.download(link.text)
    os.rename(filename, 'File.zip')
    os.chdir('../')

Você pode salvá-lo em um arquivo ou simplesmente colar / digitar em um interpretador de clones python3, depende de você.

Você precisará instalar o python3-wget e beautifulsoup4 usando pip ou easy_install etc.

    
por 03.04.2018 / 01:15
1

Se você puder usar jq , a API Librivox também fornecerá saída JSON, e provavelmente será mais fácil analisar JSON com jq do que XML com ferramentas XML adequadas.

u='https://librivox.org/api/feed/audiobooks/?offset=0&limit=3&fields=%7Blanguage,authors,title,url_zip_file%7B&format=json'
curl "$u" -sL |
  jq -r '.books[] | "\(.language).\(.authors[0].last_name + .authors[0].first_name).\(.title).zip", .url_zip_file'

Dá saída como:

English.DumasAlexandre.Count of Monte Cristo.zip
http://www.archive.org/download/count_monte_cristo_0711_librivox/count_monte_cristo_0711_librivox_64kb_mp3.zip
English.BalzacHonoré de.Letters of Two Brides.zip
http://www.archive.org/download/letters_brides_0709_librivox/letters_brides_0709_librivox_64kb_mp3.zip
English.DickensCharles.Bleak House.zip
http://www.archive.org/download/bleak_house_cl_librivox/bleak_house_cl_librivox_64kb_mp3.zip

Depois disso, é relativamente simples usar xargs :

curl "$u" -sL |
  jq -r '.books[] | "\(.language).\(.authors[0].last_name + .authors[0].first_name).\(.title).zip", .url_zip_file' |
  xargs -d '\n' -n2 wget -O

Em que xargs usa duas linhas como um argumento para wget , com a primeira linha se tornando o parâmetro -O e a segunda a URL.

Embora eu recomende uma solução baseada em Python como a de Jamie , exceto usando os recursos JSON internos do JSON e do Python em vez de bs4.

    
por 03.04.2018 / 07:03
0

Força bruta.

Se o seu xml analisado estiver em books

while read a; read b; read c; read d; read e; do wget $c -O $b$e$d$a; echo $c; done < books

Apenas recomponha suas linhas como variáveis e você é bom para ir contanto que seus blocos de registro sejam preenchidos com 5 linhas.

    
por 02.04.2018 / 23:06

Tags