Я пытался разработать класс скребка, который будет считывать данные из Википедии в файл JSON.Мне нужно уметь читать таблицы, извлекать ссылки из первых столбцов, извлекать информацию из этих ссылок и превращать ее в файл JSON.Проблема, с которой я столкнулся, заключается в том, что я получаю сообщения об ошибках, например, у NoneType нет атрибута find_all, когда я пытаюсь извлечь данные таблицы из строк таблицы.Пока я тестировал файл с одной страницей, и он работал отлично, на другой странице он борется.В то же время другие функции того же класса отлично работают на других страницах.Я также не могу выяснить ошибку индексации.
Я пытался перебирать строки, таблицы, а также перебирать объект супа, чтобы получить данные из первого столбца.Результаты, которые я получаю при различных обстоятельствах: - NoneType не имеет атрибута find_all - объект str не имеет атрибута find_all (когда я перебираю строки) - Пустой список - Только имя - Ошибка индекса.Индекс вне диапазона.
import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import re
import lxml
import wikipedia
import json
import html5lib
class wiki2json():
def __init__(self, url):
self.url = url
def urlretrieve(url):
web = requests.get(url)
text = web.text
soup = BeautifulSoup(text, 'lxml')
return soup
def get_title(url):
title = wiki2json.urlretrieve(url).find('h1', {'class': 'firstHeading'}).get_text()
return title
def get_content(url):
page = wikipedia.page(wiki2json.get_title(url))
content = page.content
return content
def get_links(url):
links = []
for link in wiki2json.urlretrieve(url).find_all('a', {'href' : re.compile('^https://|^http://')}):
links.append(link)
return links
def get_tables(url):
tables = wiki2json.urlretrieve(url).find_all('table', {'class' : ['sortable', 'plainrowheaders']})
return tables
def get_tablelinks(url):
anchor_table = []
for table in wiki2json.get_tables(url):
tablelink = wiki2json.urlretrieve(url).find_all('a')
anchor_table.append(tablelink)
return anchor_table
def get_tableheads(url):
for table in wiki2json.get_tables(url):
theads = table.find_all('th')
heads = [thead.text.strip() for thead in theads]
return heads
def get_tablerows(url):
all_tables2 = wiki2json.urlretrieve(url).find_all('table')[2]
rows = all_tables2.find_all('tr')
return rows[1:]
# wiki2json.get_tablerows('https://en.wikipedia.org/wiki/List_of_Presidents_of_India')
def get_tablenames(url):
first_column = []
names = []
for row in wiki2json.get_tablerows(url):
first_column.append(row.find_all('td')[0])
names.append([first.text.strip('\\n') for first in first_column])
return names
# wiki2json.get_tablenames('https://en.wikipedia.org/wiki/List_of_Presidents_of_India')
wiki2json.get_tablenames('https://simple.wikipedia.org/wiki/List_of_countries')