Невозможно вставить данные в таблицу с использованием базы данных Python и Oracle - PullRequest
0 голосов
/ 03 февраля 2019

Моя таблица базы данных выглядит следующим образом enter image description here

У меня есть веб-сканер, который получает новости с веб-сайта, и я пытаюсь сохранить его в этой таблице.Я использовал лоскутные и красивые библиотеки супов. Приведенный ниже код демонстрирует мою логику сканера.

import requests
from bs4 import BeautifulSoup
import os
import datetime
import cx_Oracle

def scrappy(url):
    try:
        r = requests.get(url)
        soup = BeautifulSoup(r.text, 'html.parser')
        title = soup.find('title').text.split('|')[0]
        time =soup.find('span', attrs={'class':'time_cptn'}).find_all('span')[2].contents[0]
        full_text =soup.find('div', attrs={'class':'article_content'}).text.replace('Download The Times of India News App for Latest India News','')
    except:
        return ('','','','')
    else:
        return (title,time,url,full_text)

def pathmaker(name):   
    path = "Desktop/Web_Crawler/CRAWLED_DATA/{}".format(name)

    try:  
        os.makedirs(path)
    except OSError:  
        pass
    else:  
        pass

def filemaker(folder,links_all):
    #k=1
    for link in links_all:
        scrapped=scrappy(link)    
        #textfile=open('Desktop/Web_Crawler/CRAWLED_DATA/{}/text{}.txt'.format(x,k),'w+')
        #k+=1
        Title = scrapped[0]
        Link = scrapped[2]
        Dates = scrapped[1]
        Text = scrapped[3]
        con = cx_Oracle.connect('shivams/tiger@127.0.0.1/XE')
        cursor = con.cursor()
        sql_query = "insert into newsdata values(:1,:2,:3,:4)"
        cursor.executemany(sql_query,[Title,Link,Dates,Text])
        con.commit()
        cursor.close()
        con.close()
        #textfile.write('Title\n{}\n\nLink\n{}\n\nDate & Time\n{}\n\nText\n{}'.format(scrapped[0],scrapped[2],scrapped[1],scrapped[3]))
        #textfile.close()
        con.close()



folders_links=[('India','https://timesofindia.indiatimes.com/india'),('World','https://timesofindia.indiatimes.com/world'),('Business','https://timesofindia.indiatimes.com/business'),('Homepage','https://timesofindia.indiatimes.com/')]

for x,y in folders_links:
    pathmaker(x)
    r = requests.get(y)
    soup = BeautifulSoup(r.text, 'html.parser')
    if x!='Homepage':
        links =soup.find('div', attrs={'class':'main-content'}).find_all('span', attrs={'class':'twtr'})
        links_all=['https://timesofindia.indiatimes.com'+links[x]['data-url'].split('?')[0] for x in range(len(links))]
    else:
        links =soup.find('div', attrs={'class':'wrapper clearfix'})
        total_links = links.find_all('a')
        links_all=[]
        for p in range(len(total_links)):
            if 'href' in str(total_links[p]) and '.cms'  in total_links[p]['href'] and  'http' not in total_links[p]['href'] and 'articleshow' in total_links[p]['href'] :
                links_all+=['https://timesofindia.indiatimes.com'+total_links[p]['href']]

    filemaker(x,links_all)

Раньше я создавал текстовые файлы и сохранял в них новости, но теперь я хочу сохранить их в базе данных для своеговеб-приложение для доступа к нему.Моя логика базы данных находится в функции создателя файла.Я пытаюсь вставить значения в таблицу, но она не работает и выдает различные типы ошибок.Я следил за другими постами на сайте, но они не работали в моем случае.Кто-нибудь может мне с этим помочь.Также я не уверен, что это правильный способ вставить данные CLOB, так как я использую их впервые.Нужна помощь.

1 Ответ

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

Вы можете сделать следующее:

cursor.execute(sql_query, [Title, Link, Dates, Text])

или, если вы строите список этих значений, вы можете сделать следующее:

allValues = []
allValues.append([Title, Link, Dates, Text])
cursor.executemany(sql_query, allValues)

Надеюсь, что это объясняет!

...