Я пытаюсь создать программу, которая анализирует основной текст каждой статьи на каждой странице архива этого новостного сайта. Первоначально моя программа остановилась на строке 32, и я распечатал каждую ссылку и сохранил их в файл csv, и это сработало. Теперь я хочу открыть каждую ссылку и сохранить основной текст статьи в файл csv. Я попытался сделать тот же формат кода, что и изначально, с точки зрения использования BeautifulSoup, но теперь мой код ничего не печатает. Я не знаю, связана ли моя проблема с тем, как я использую BeautifulSoup, или с тем, как я написал теги из HTML-кода веб-сайта. Вот сайт архива: https://www.politico.com/newsletters/playbook/archive (на нем 408 страниц)
from bs4 import BeautifulSoup
from urllib.request import urlopen
csvFile = 'C:/Users/k/Dropbox/Politico/pol.csv'
with open(csvFile, mode='w') as pol:
csvwriter = csv.writer(pol, delimiter='|', quotechar='"', quoting=csv.QUOTE_MINIMAL)
#for each page on Politico archive
for p in range(0,409):
url = urlopen("https://www.politico.com/newsletters/playbook/archive/%d" % p)
content = url.read()
#Parse article links from page
soup = BeautifulSoup(content,"lxml")
articleLinks = soup.findAll('article', attrs = {'class':'story-frag format-l'})
#Each article link on page
for article in articleLinks:
link = article.find('a', attrs = {'target':'_top'}).get('href')
#Open and read each article link
articleURL = urlopen(link)
articleContent = articleURL.read()
#Parse body text from article page
soupArticle = BeautifulSoup(articleContent, "lxml")
#Limits to div class = story-text tag (where article text is)
articleText = soup.findAll('div', attrs = {'class':'story-text'})
for div in articleText:
#Limits to b tag (where the body text seems so exclusively be)
bodyText = div.find('b')
print(bodyText)
#Adds article link to csv file
csvwriter.writerow([bodyText])
Я ожидаю, что вывод будет печатать основной текст каждой статьи в архиве и сохранять все это в файл csv.
он ничего не печатает, потому что вы смотрите не в то место articleText = soup.findAll('div', attrs = {'class':'story-text'})
Вы сохранили это как soupArticle
, а не soup
.
Также вам нужен текст или элемент html? Как есть, вы получаете тег/элемент. Если вам нужен только текст, вам понадобится bodyText = div.find('b').text
Но главная проблема в том, что вы хотите изменить:
articleText = soup.findAll('div', attrs = {'class':'story-text'})
к
articleText = soupArticle.findAll('div', attrs = {'class':'story-text'})
Чтобы получить полную статью, вам нужно пройтись по тегам p
. И выясните, как пропустить те части, которые вам не нужны. Есть лучший способ сделать это, но чтобы вы начали, что-то вроде этого:
for article in articleLinks:
link = article.find('a', attrs = {'target':'_top'}).get('href')
articleURL = urlopen(link)
articleContent = articleURL.read()
soupArticle = BeautifulSoup(articleContent, "lxml")
articleText = soupArticle.findAll('div', attrs = {'class':'story-text'})
for div in articleText:
bodyText = div.find_all('p')
for para in bodyText:
if 'By ' in para.text:
continue
print (para.text.strip())
@kittykat14 kittykat14 Я добавил немного больше к решению выше. Кроме того, если решение полезно, обязательно примите его.
Спасибо, что указали на мою ошибку в статье о супе против супа. Это имеет смысл для меня. Для текстовой части мне просто нужен текст, а не элемент html. Итак, я опробовал ваше предложение, и оно распечатывает только выделенное жирным шрифтом вступление к каждому абзацу. Я пытаюсь напечатать всю статью, выделенную жирным шрифтом и не выделенную жирным шрифтом. Это определенно ставит меня в правильном направлении, хотя. Я попробовал div.find('p').text, так как вся статья, похоже, относится к классу p, но в нее включены вещи, которые я не хотел печатать, например имена авторов. Вы знаете, как я могу исправить это, чтобы это был просто текст статьи? Спасибо!