#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()