Получение данных из URL и помещение их в DataFrame - PullRequest
0 голосов
/ 10 июля 2019

Привет всем. В настоящее время я пытаюсь получить некоторые данные из URL-адресов, а затем пытаюсь предсказать, к какой категории должна относиться эта статья.Пока я сделал это, но у него есть ошибка:

    info = pd.read_csv('labeled_urls.tsv',sep='\t',header=None)
    html, category = [], []
    for i in info.index:
        response = requests.get(info.iloc[i,0])
        soup = BeautifulSoup(response.text, 'html.parser')
        html.append([re.sub(r'<.*?>','', 
                      str(soup.findAll(['p','h1','\href="/avtorji/'])))])
        category.append(info.iloc[0,i])

    data = pd.DataFrame()
    data['html'] = html
    data['category'] = category

И ошибка такова:

IndexError: одиночный позиционный индексатор выходит за пределы.

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Ошибка, вероятно, вызвана передачей индекса в iloc: loc ожидают значения индекса и имена столбцов, в то время как iloc ожидают числовое положение строк и столбцов.Кроме того, вы поменяли местами строки и столбцы для category с category.append(info.iloc[0,i]).Поэтому вы должны по крайней мере сделать следующее:

for i in range(len(info)):
    response = requests.get(info.iloc[i,0])
    ...
    category.append(info.iloc[i,0])

Но поскольку вы пытаетесь перебрать первый столбец информационного кадра, приведенный выше код не является Pythonic.Лучше напрямую использовать столбец:

for url in info.loc[:, 0]:
    response = requests.get(url)
    ...
    category.append(url)
1 голос
/ 10 июля 2019

Вы можете избежать вызова iloc и использовать вместо него iterrows, и я думаю, что вам придется использовать loc вместо iloc, потому что вы работали с индексом, но используете iloc и loc впетли, как правило, не так эффективны.Вы можете попробовать следующий код (с указанием времени ожидания):

import time

info = pd.read_csv('labeled_urls.tsv',sep='\t',header=None)
html, category = [], []
for i, row in info.iterrows():
    url= row.iloc[0]
    time.sleep(2.5)  # wait 2.5 seconds
    response = requests.get(url)  # you can use row[columnname] instead here as well (i only use iloc, because I don't know the column names)
    soup = BeautifulSoup(response.text, 'html.parser')
    html.append([re.sub(r'<.*?>','', 
                  str(soup.findAll(['p','h1','\href="/avtorji/'])))])
    # the following iloc was probably raising the error, because you access the ith column in the first row of your df
    # category.append(info.iloc[0,i])
    category.append(row.iloc[0])  # not sure which field you wanted to access here, you should also replace it by row['name']

data = pd.DataFrame()
data['html'] = html
data['category'] = category

Если вам действительно нужен только URL в вашем цикле, вы должны заменить:

for i, row in info.iterrows():
    url= row.iloc[0]

на что-то вроде:

for url in info[put_the_name_of_the_url_column_here]: # or info.iloc[:,0] as proposed by serge
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...