Как скопировать инфобокс Википедии и сохранить его в CSV-файл - PullRequest
0 голосов
/ 20 февраля 2019

Я уже удалил инфобокс Википедии, но я не знаю, как хранить данные в файле CSV.Пожалуйста, помогите мне.

from bs4 import BeautifulSoup as bs
from urllib.request import urlopen


def infobox(query) :
    query = query
    url = 'https://en.wikipedia.org/wiki/'+query
    raw = urlopen(url)
    soup = bs(raw)
    table = soup.find('table',{'class':'infobox vcard'})
    for tr in table.find_all('tr') :
        print(tr.text)
infobox('Infosys')

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вот схема того, как вы можете проверить, есть ли в строке заголовок и элемент ячейки таблицы, чтобы обеспечить два столбца (можно развернуть, чтобы записать только строки td, чтобы заполнить, возможно, первый столбец в структуре if).Я использую немного другой синтаксис кодирования для более чистого вывода, select для более быстрого выбора элементов, чем поиск и использование панд для генерации CSV.

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
url = 'https://en.wikipedia.org/wiki/'+ 'Infosys'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36', 'Referer': 'https://www.nseindia.com/'}
r = requests.get(url,  headers=headers)
soup = bs(r.content,'lxml')
table =soup.select_one('.infobox.vcard')
rows = table.find_all('tr')
output = []
for row in rows:
    if len(row.select('th, td')) == 2:
        outputRow = [row.select_one('th').text, row.select_one('td').text, [item['href'] for item in row.select('td a')] if row.select_one('td a') is not None else '']
        outputRow[2] = ['https://en.wikipedia.org/wiki/Infosys' + item if item[0] == '#' else 'https://en.wikipedia.org' + item for item in outputRow[2]]
        output.append(outputRow)
df = pd.DataFrame(output)    
df.to_csv(r'C:\Users\User\Desktop\Data.csv', sep=',', encoding='utf-8-sig',index = False )
0 голосов
/ 20 февраля 2019

Вы должны собрать необходимые данные и записать в CSV-файл, вы можете использовать модуль CSV, см. Пример ниже:

from bs4 import BeautifulSoup as bs
from urllib import urlopen
import csv


def infobox(query) :
    query = query
    content_list = []
    url = 'https://en.wikipedia.org/wiki/'+query
    raw = urlopen(url)
    soup = bs(raw)
    table = soup.find('table',{'class':'infobox vcard'})
    for tr in table.find_all('tr') :
        if len(tr.contents) > 1:
            content_list.append([tr.contents[0].text.encode('utf-8'), tr.contents[1].text.encode('utf-8')])
        elif tr.text:
            content_list.append([tr.text.encode('utf-8')])
    write_csv_file(content_list)

def write_csv_file(content_list):
    with open(r'd:\Test.csv', mode='wb') as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        writer.writerows(content_list)

infobox('Infosys')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...