저는 웹 스크래핑(및 일반 프로그래밍)이 처음이고 필요한 정보를 얻기 위해 Python 및 Bash 스크립트를 사용하고 있습니다. 저는 WSL(Linux용 Windows 하위 시스템)을 사용하여 실행 중이고 어떤 이유로 스크립트가 git-bash를 사용하여 실행되고 있습니다.
웹 페이지의 Html을 다운로드한 다음 다른 웹 페이지에 대한 링크가 포함된 2개의 txt 파일을 반환하는 Python 스크립트로 보내는 bash 스크립트를 만들려고 합니다. 그런 다음 원본 스크립트는 txt 파일의 링크 중 하나를 반복하여 각 웹 페이지의 html 콘텐츠를 링크의 특정 부분 이름을 딴 파일로 다운로드합니다. 그러나 마지막 루프는 작동하지 않습니다.
컬 명령에 대한 링크를 수동으로 작성하면 작동합니다. 하지만 스크립트를 실행하려고 하면 작동하지 않습니다.
Bash 스크립트는 다음과 같습니다.
#!/bin/bash
curl http://mythicspoiler.com/sets.html |
cat >>mainpage.txt
python creatingAListOfAllExpansions.py #returns two txt files containing the expansion links and the commander decks' links
rm mainpage.txt
#get the pages from the links
cat commanderDeckLinks.txt |
while read a ; do
curl $a | ##THIS DOESN'T WORK
cat >>$(echo $a | cut --delimiter="/" -f4).txt
done
나는 몇 가지 다른 접근 방식을 시도하고 비슷한 문제를 보았지만 평생 동안 이 문제를 해결할 수 없습니다. 항상 같은 오류가 나타납니다.
curl: (3) URL using bad/illegal format or missing URL
CommanderDeckLinks.txt의 내용은 다음과 같습니다.
http://mythicspoiler.com/cmd/index.html
http://mythicspoiler.com/c13/index.html
http://mythicspoiler.com/c14/index.html
http://mythicspoiler.com/c15/index.html
http://mythicspoiler.com/c16/index.html
http://mythicspoiler.com/c17/index.html
http://mythicspoiler.com/c18/index.html
http://mythicspoiler.com/c19/index.html
http://mythicspoiler.com/c20/index.html
이것은 Python 스크립트입니다.
#reads the main page of the website
with open("mainpage.txt") as datafile:
data = datafile.read()
#gets the content after the first appearance of the introduced string
def getContent(data, x):
j=0
content=[]
for i in range(len(data)):
if(data[i].strip().startswith(x) and j == 0):
j=i
if(i>j and j != 0):
content.append(data[i])
return content
#gets the content of the website that is inside the body tag
mainNav = getContent(data.splitlines(), "<!--MAIN NAVIGATION-->")
#gets the content of the website that is inside of the outside center tags
content = getContent(mainNav, "<!--CONTENT-->")
#removes extra content from list
def restrictNoise(data, string):
content=[]
for i in data:
if(i.startswith(string)):
break
content.append(i)
return content
#return only lines which are links
def onlyLinks(data):
content=[]
for i in data:
if(i.startswith("<a")):
content.append(i)
return content
#creates a list of the ending of the links to later fetch
def links(data):
link=[]
for i in data:
link.append(i.split('"')[1])
return link
#adds the rest of the link
def completLinks(data):
completeLinks=[]
for i in data:
completeLinks.append("http://mythicspoiler.com/"+i)
return completeLinks
#getting the commander decks
commanderDecksAndNoise = getContent(content,"<!---->")
commanderDeck = restrictNoise(commanderDecksAndNoise, "<!---->")
commanderDeckLinks = onlyLinks(commanderDeck)
commanderDecksCleanedLinks = links(commanderDeckLinks)
#creates a txt file and writes in it
def writeInTxt(nameOfFile, restrictions, usedList):
file = open(nameOfFile,restrictions)
for i in usedList:
file.write(i+"\n")
file.close()
#creating the commander deck text file
writeInTxt("commanderDeckLinks.txt", "w+", completLinks(commanderDecksCleanedLinks))
#getting the expansions
expansionsWithNoise = getContent(commanderDecksAndNoise, "<!---->")
expansionsWithoutNoise = restrictNoise(expansionsWithNoise, "</table>")
expansionsLinksWNoise = onlyLinks(expansionsWithoutNoise)
expansionsCleanedLinks = links(expansionsLinksWNoise)
#creating the expansions text file
writeInTxt("expansionLinks.txt", "w+", completLinks(expansionsCleanedLinks))
내 문제를 해결하기 위해 추가 정보가 필요하면 알려주시기 바랍니다. 도움을 주신 모든 분들께 감사드립니다
답변1
여기서 문제는 bash(Linux)와 창의 줄 끝이 각각 LF와 CRLF로 다르다는 것입니다(이것이 모두 새로운 것이기 때문에 잘 모르겠습니다). 따라서 줄로 구분된 항목이 포함된 Python 파일을 만들면 생성된 파일에 CRLF 끝이 있고 bash 스크립트는 LF만 읽기 때문에 URL을 쓸모 없게 만들기 때문에 bash 스크립트는 파일을 잘 읽을 수 없습니다. 거기 없어. Bash 코드를 사용하여 이 문제를 해결하는 방법을 모르지만 내가 한 일은 밑줄 "_"로 구분된 각 항목이 있는 파일을 생성하고(파이썬을 사용하여) 마지막 항목 n을 추가하여 끝을 처리할 필요가 없도록 하는 것이었습니다. 라인의. 그런 다음 마지막 항목을 제외하고 밑줄로 구분된 각 항목을 반복하는 bash에서 for 루프를 실행했습니다. 이로써 문제가 해결되었습니다.