Как извлечь текстовые данные в первом столбце из таблицы Википедии? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытался разработать класс скребка, который будет считывать данные из Википедии в файл 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')

1 Ответ

0 голосов
/ 25 декабря 2018

Следующий скрипт должен получить необходимые данные из первого столбца этой таблицы.Я использовал жестко закодированный индекс в конце .find_all(), чтобы избежать получения заголовков.Дайте ему шанс:

import requests
from bs4 import BeautifulSoup

url = "https://simple.wikipedia.org/wiki/List_of_countries"

res = requests.get(url)
soup = BeautifulSoup(res.text,"lxml")
for items in soup.find(class_="wikitable").find_all("tr")[1:]:
    data = items.find("td").get_text(strip=True)
    print(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...