Как исправить мой код Python, который анализирует основной текст с веб-сайта? - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь создать программу, которая анализирует основной текст каждой статьи на каждой странице архива этого новостного сайта. Первоначально моя программа остановилась на строке 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-файл.

1 Ответ

1 голос
/ 22 мая 2019

ничего не печатается, потому что вы смотрите не в том месте на 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...