Bs4: Попытка зацикливаться на разных массивах с разными длинами.Get IndexError: список индексов вне диапазона - PullRequest
0 голосов
/ 25 января 2019

С Beautifulsoup4 и python3.7 я пытаюсь зациклить некоторые массивы со ссылками.После, хотите получить текст из тегов.Но я сталкиваюсь с ошибкой при передаче кода на терминал.

Вот код:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import re
import csv
my_url = "http://www.example.com"
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "html.parser")
links = page_soup.select('dt > a[href]')
link = [tag.get('href') for tag in links]
i = 0
for i in range(0, 5000):
    url = link[i]
    Client = uReq(url)
    pageHtml = Client.read()
    Client.close()  
    pSoup = soup(pageHtml, "html.parser")
    linkeas = pSoup.findAll(href=re.compile(my_url))
    def linkas(href):
        return href and re.compile("html").search(href) and re.compile(my_url).search(href)
    linka = pSoup.findAll(href=linkas)
    if linka != []:
    linkia = [tag.get('href') for tag in linka]
    linko = len(linkia)
    j = 0
    for j in range (0, linko):
        curl = linkia[j]
        cClient = uReq(curl)
        pageHtml = cClient.read()
        cClient.close() 
        Soup = soup(page_html, "html.parser")
        country = Soup.select('.class > a:nth-of-type(3)')
        countri = country[0].text.strip()
        print(countri)

Я пробовал несколько дней несколько способов, но дошел до этого безрезультатно:

Traceback (most recent call last):
File "<stdin>", line 22, in <module>
IndexError: list index out of range   

Может кто-нибудь дать какой-нибудь совет?

ПРИМЕЧАНИЕ:

Массивы выглядят так:

print(linkia)

['http://www.example/example/1.html']
['http://www.example/example/2.html']
['http://www.example/example/3.html', 'http://www.example/example/4.html', 
'http://www.example/example/5.html', 'http://www.example/example/6.html', 
'http://www.example/example/7.html', 'http://www.example/example/8.html', 
'http://www.example/example/9.html', 'http://www.example/example/10.html', 
'http://www.example/example/11.html', 'http://www.example/example/12.html', 
'http://www.example/example/13.html', 'http://www.example/example/14.html', 
'http://www.example/example/15.html', 'http://www.example/example/16.html', 
'http://www.example/example/17.html', 'http://www.example/example/18.html', 
'http://www.example/example/19.html']
['http://www.example/example/20.html', 'http://www.example/example/example/21.html', 
'http://www.example/example/example/22.html']
['http://www.example/example/23.html']

Большое спасибо за ваше время,Очень ценю.Будут все время связаны с быстрым ответом.

1 Ответ

0 голосов
/ 25 января 2019

изменить:

i = 0
for i in range(0, 5000):
    url = link[i]

на просто:

for url in link:

И тогда можно избавиться от url = link[i]

Вы по сути говорите это циклудо 5000 элементов в вашем списке, когда у вас нет 5000 элементов, следовательно, list index out of range.Вы действительно хотите, чтобы он проходил по каждому элементу, пока не закончатся элементы.И вы можете сделать это, просто сказав for url in link:

Затем то же самое для вашего другого вложенного цикла for.

измените:

j = 0
for j in range (0, linko):
    curl = linkia[j]

на:

for curl in linkia:

Также отмечу, что если бы вы настроили его так, как вам нужно, вам не нужно было бы устанавливать начальные значения i или j равными = 0. Так как вы устанавливаете диапазон / список для перехода от0, 5000 ... цикл for будет автоматически начинаться с этого первого элемента 0. Но опять же, эта точка не имеет значения, так как я бы не рекомендовал повторять этот список таким образом.Это а) не является надежным (вам потребуется ровно 5000 элементов в вашем списке каждый раз, когда он попадает в этот цикл), и б) в то время как он будет работать нормально для вашего второго цикла, потому что вы устанавливаете диапазон от 0 до длинысписок, это действительно не нужно, так как вы можете сжать это в 1 строку.

Попробуйте:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import re
import csv
my_url = "http://www.example.com"
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "html.parser")
links = page_soup.select('dt > a[href]')
link = [tag.get('href') for tag in links]

for url in link:

    Client = uReq(url)
    pageHtml = Client.read()
    Client.close()  
    pSoup = soup(pageHtml, "html.parser")
    linkeas = pSoup.findAll(href=re.compile(my_url))
    def linkas(href):
        return href and re.compile("html").search(href) and re.compile(my_url).search(href)
    linka = pSoup.findAll(href=linkas)
    if linka != []:
        linkia = [tag.get('href') for tag in linka]

        for curl in linkia:

            cClient = uReq(curl)
            pageHtml = cClient.read()
            cClient.close() 
            Soup = soup(page_html, "html.parser")
            country = Soup.select('.class > a:nth-of-type(3)')
            countri = country[0].text.strip()
            print(countri) 
...