我一直在尝试开发一个刮板类,该类会将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')
答案 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)