Список ошибок диапазона при работе с файлами CSV - PullRequest
0 голосов
/ 24 февраля 2020

Я использую скребок 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/

1 Ответ

0 голосов
/ 24 февраля 2020

Это работает (код преобразуется в python 3)

import requests
from lxml import html
import string


def get_authors():
    baseUrl = 'http://www.brainyquote.com'
    urlString = 'http://www.brainyquote.com/authors/'
    authorsUrl = [urlString + x for x in list(string.ascii_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 + str(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(str(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(str(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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...