Веб-очистка python для арабского текста

#python #dataframe #web-scraping #nlp #arabic

#python #фрейм данных #веб-очистка #nlp #Арабский

Вопрос:

Я пытаюсь очистить веб-сайт: «http://norumors.net/?post_type=rumors?post_type=rumors » чтобы получить только заголовочные новости и поместить их в CSV-файл с помощью Beautifulsoup и python, это код, который я использую после просмотра исходного кода HTML «просмотр-источник: http: //norumors.net/?post_type= слухи?post_type= слухи»

 import urllib.request,sys,time
from bs4 import BeautifulSoup
import requests
import pandas as pd

pagesToGet= 1

upperframe=[]  
for page in range(1,pagesToGet 1):
    print('processing page :', page)
    url = 'http://norumors.net/?post_type=rumors/?page=' str(page)
    print(url)
    
    #an exception might be thrown, so the code should be in a try-except block
    try:
        #use the browser to get the url. This is suspicious command that might blow up.
        page=requests.get(url)                             # this might throw an exception if something goes wrong.
    
    except Exception as e:                                   # this describes what to do if an exception is thrown
        error_type, error_obj, error_info = sys.exc_info()      # get the exception information
        print ('ERROR FOR LINK:',url)                          #print the link that cause the problem
        print (error_type, 'Line:', error_info.tb_lineno)     #print error info and line that threw the exception
        continue                                              #ignore this page. Abandon this and go back.
    time.sleep(2)   
    soup=BeautifulSoup(page.text,'html.parser')
    frame=[]
    links=soup.find_all('li',attrs={'class':'o-listicle__item'})
    print(len(links))
    filename="NEWS.csv"
    f=open(filename,"w", encoding = 'utf-8')
    headers="Statement,Linkn"
    f.write(headers)
    
    for j in links:
        Statement = j.find("div",attrs={'class':'row d-flex'}).text.strip()
       # Link = "http://norumors.net/"
        Link  = j.find("div",attrs={'class':'col-lg-4 col-md-4 col-sm-6 col-xs-6'}).find('a')['href'].strip()
        frame.append((Statement,Link))
        f.write(Statement.replace(",","^") "," Link "," Date.replace(",","^") "," Source.replace(",","^") "," Label.replace(",","^") "n")
    upperframe.extend(frame)
f.close()
data=pd.DataFrame(upperframe, columns=['Statement','Link'])
data.head()
 

но после того, как я запускаю код, я получаю фрейм данных pandas и пустой файл CSV, есть какие-либо предложения, почему это так? зная, что я хочу получить текст между тегами.

Ответ №1:

Если я правильно понимаю, вы хотите получить текстовую часть заголовков новостей и ссылку href на эти новости. Вы также хотите записать их в файл CSV. Проблема с вашим кодом for j in links: заключается в том, что он не выполняется, поскольку soup.find_all('li',attrs={'class':'o-listicle__item'}) возвращает пустой список. Вы должны быть осторожны с именами и классами тегов, которые вы ищете. Приведенный ниже код получает новостные тексты и ссылки на них, а также записывает их в файл CSV с помощью pd.DataFrame .

 import urllib.request,sys,time
from bs4 import BeautifulSoup 
import requests
import pandas as pd

pagesToGet = 1

for page in range(1,pagesToGet 1):
    print('processing page :', page)
    url = 'http://norumors.net/?post_type=rumors/?page='   str(page)
    print(url)

    #an exception might be thrown, so the code should be in a try-except block
    try:
        #use the browser to get the url. This is suspicious command that might blow up.
        page = requests.get(url)                             # this might throw an exception if something goes wrong.

    except Exception as e:                                   # this describes what to do if an exception is thrown
        error_type, error_obj, error_info = sys.exc_info()      # get the exception information
        print('ERROR FOR LINK:',url)                          #print the link that cause the problem
        print(error_type, 'Line:', error_info.tb_lineno)     #print error info and line that threw the exception
        continue                                              #ignore this page. Abandon this and go back.

    soup = BeautifulSoup(page.text,'html.parser')
    texts = []
    links = []
    filename = "NEWS.csv"
    f = open(filename,"w", encoding = 'utf-8')

    Statement = soup.find("div",attrs={'class':'row d-flex'})
    divs = Statement.find_all("div",attrs={'class':'col-lg-4 col-md-4 col-sm-6 col-xs-6'})

    for div in divs:
        txt = div.find("img",attrs={'class':'rumor__thumb'})
        texts.append(txt['alt'])
        lnk = div.find("a",attrs={'class':'rumor--archive'})
        links.append(lnk['href'])

data = pd.DataFrame(list(zip(texts, links)), columns=['Statement', 'Link'])
data.to_csv(f, encoding='utf-8', index=False)
f.close()