Я использую скребок python, который очищает кавычки с веб-страницы и выводит результат в файл CSV. Я не написал это сам, потому что я новичок, но, поскольку я запускал этот код, чтобы протестировать его и использовать его части, я получил эту ошибку. Я знаю, что означает ошибка, но я совершенно не знаю, как подойти, чтобы это исправить. Я хотел бы pu sh обновление на github автора, чтобы помочь.
Traceback (most recent call last):
File "quotes.py", line 100, in <module>
get_authors()
File "quotes.py", line 58, in get_authors
quote_details = fetch_quote(url)
File "quotes.py", line 77, in fetch_quote
tempString += ("\"%s\","%next(q.find_class('b-qt')[0].iter('a')).text)
IndexError: list index out of range
Проблема возникает, когда он начинает извлекать кавычки. Создание списка авторов и списка работ URL без каких-либо проблем. Ошибка IndexError возникает после создания файла CSV, и в этот момент возникает ошибка, поэтому я предполагаю, что проблема связана с этой частью кода:
tempString += ("\"%s\","%next(q.find_class('b-qt')[0].iter('a')).text)
Звучит ли это правильно? Я не имею ни малейшего понятия, как решать ошибки в Python за исключением typeErrors и некоторых более простых IndexErrors. Я бы с удовольствием учился, но все мои поиски в stackoverflow показывали многим людям с такой же проблемой, когда дело касается файлов CSV. Но все ответы были очень конкретны c.
#!/usr/bin/python
import requests
from lxml import html
import time
import string
def get_authors():
baseUrl = 'http://www.brainyquote.com'
urlString = 'http://www.brainyquote.com/authors/'
authorsUrl = [urlString + x for x in list(string.lowercase[:26])]
urlsList = [] # authors list page urls
print ""
print "Scanning Started for page links"
print ""
for url in authorsUrl:
print "Scanning URL: %s"%url
urlsList.append(url)
urlsList.extend(pagination(url, False))
authorsList = []
print ""
print "Scanning Started for Author Pages"
print ""
for url in urlsList:
print "Scanning URL: %s"%url
authorsList.extend(get_authors_links(url))
# Write all authors links
authorsFile = open("authors.txt","a+")
for urls in authorsList:
authorsFile.write(baseUrl + urls.encode('utf-8') + "\n")
authorsFile.close()
quoteLinks = []
# Write all authors links
print ""
print "Scanning Started for Quote Page Links"
print ""
for url in authorsList:
newUrl = (baseUrl + url)
print "Scanning URL: %s"%newUrl
quoteLinks.append(newUrl)
arr = pagination(newUrl, True)
quoteLinks.extend(arr)
# Write all quotes link
linksFile = open("quotes_links.txt","a+")
for url in quoteLinks:
linksFile.write(url.encode('utf-8') + "\n")
linksFile.close()
print ""
print "Scanning Started for fetching quotes"
print ""
# Write all quotes
quotesFile = open("quotes.csv","a+")
for url in quoteLinks:
quote_details = fetch_quote(url)
quotesFile.write(quote_details.encode('utf-8') + "\n")
print ""
print "All Done \nThanks for using it...!!!"
print ""
def get_authors_links(url):
page = requests.get(url)
tree = html.fromstring(page.text)
arr = tree.xpath('//table[@class="table table-hover table-bordered"]//td/a/@href')
return arr
def fetch_quote(url):
page = requests.get(url)
tree = html.fromstring(page.text)
quotes = tree.find_class('bqQt')
tempString = ""
for q in quotes:
tempString += ("\"%s\","%next(q.find_class('b-qt')[0].iter('a')).text)
tempString += ("%s,"%next(q.find_class('bq-aut')[0].iter('a')).text)
for element in q.find_class('oncl_k'):
tempString += "%s "%element.text
tempString += "\n"
return tempString
def pagination(url, htmlPage): # .html or not - htmlPage True or False
arr = []
page = requests.get(url)
tree = html.fromstring(page.text)
end = tree.xpath('//div[@class="row paginationContainer"]//nav//ul/li[last()-1]/a/text()')
if len(end):
if(htmlPage):
url = url.split('.html')[0]
for count in range(2, int(end[0])+1):
arr.append(url+"%s.html"%(count))
else:
for count in range(2, int(end[0])+1):
arr.append(url+"%s"%(count))
return arr
if __name__ == '__main__':
get_authors()#!/usr/bin/python
import requests
from lxml import html
import time
import string
def get_authors():
baseUrl = 'http://www.brainyquote.com'
urlString = 'http://www.brainyquote.com/authors/'
authorsUrl = [urlString + x for x in list(string.lowercase[:26])]
urlsList = [] # authors list page urls
print ""
print "Scanning Started for page links"
print ""
for url in authorsUrl:
print "Scanning URL: %s"%url
urlsList.append(url)
urlsList.extend(pagination(url, False))
authorsList = []
print ""
print "Scanning Started for Author Pages"
print ""
for url in urlsList:
print "Scanning URL: %s"%url
authorsList.extend(get_authors_links(url))
# Write all authors links
authorsFile = open("authors.txt","a+")
for urls in authorsList:
authorsFile.write(baseUrl + urls.encode('utf-8') + "\n")
authorsFile.close()
quoteLinks = []
# Write all authors links
print ""
print "Scanning Started for Quote Page Links"
print ""
for url in authorsList:
newUrl = (baseUrl + url)
print "Scanning URL: %s"%newUrl
quoteLinks.append(newUrl)
arr = pagination(newUrl, True)
quoteLinks.extend(arr)
# Write all quotes link
linksFile = open("quotes_links.txt","a+")
for url in quoteLinks:
linksFile.write(url.encode('utf-8') + "\n")
linksFile.close()
print ""
print "Scanning Started for fetching quotes"
print ""
# Write all quotes
quotesFile = open("quotes.csv","a+")
for url in quoteLinks:
quote_details = fetch_quote(url)
quotesFile.write(quote_details.encode('utf-8') + "\n")
print ""
print "All Done \nThanks for using it...!!!"
print ""
def get_authors_links(url):
page = requests.get(url)
tree = html.fromstring(page.text)
arr = tree.xpath('//table[@class="table table-hover table-bordered"]//td/a/@href')
return arr
def fetch_quote(url):
page = requests.get(url)
tree = html.fromstring(page.text)
quotes = tree.find_class('bqQt')
tempString = ""
for q in quotes:
tempString += ("\"%s\","%next(q.find_class('b-qt')[0].iter('a')).text)
tempString += ("%s,"%next(q.find_class('bq-aut')[0].iter('a')).text)
for element in q.find_class('oncl_k'):
tempString += "%s "%element.text
tempString += "\n"
return tempString
def pagination(url, htmlPage): # .html or not - htmlPage True or False
arr = []
page = requests.get(url)
tree = html.fromstring(page.text)
end = tree.xpath('//div[@class="row paginationContainer"]//nav//ul/li[last()-1]/a/text()')
if len(end):
if(htmlPage):
url = url.split('.html')[0]
for count in range(2, int(end[0])+1):
arr.append(url+"%s.html"%(count))
else:
for count in range(2, int(end[0])+1):
arr.append(url+"%s"%(count))
return arr
if __name__ == '__main__':
get_authors()
Любые идеи или указатели будут высоко оценены. Из того, что я знаю, это не должно быть трудно исправить, но для новичка идея изменить на 3 строки более длинный код, чем я привык, очень устрашает.
Весь кредит автору, надеюсь, я смогу исправить sh исправление с вашей помощью:
https://github.com/ravingupta/brainyquote/