如何从Wikipedia表中提取第一列中的文本数据?

时间:2018-12-24 05:41:30

标签: python web-scraping beautifulsoup

我一直在尝试开发一个刮板类,该类会将Wikipedia数据读入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 :(得分:0)

以下脚本应从该表的第一列中获取所需数据。为了避免获取标头,我在.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)