Тэг названия новостей Google для красивого супа - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь извлечь результаты поиска из новостей Google (например, о вакцине) и провести некоторый анализ настроений на основе собранных заголовков.

Пока что я не могу найти правильный тег для сбора заголовков.

Вот мой код:

from textblob import TextBlob
import requests
from bs4 import BeautifulSoup

class Analysis:
    def __init__(self, term):
        self.term = term
        self.subjectivity = 0
        self.sentiment = 0
        self.url = 'https://www.google.com/search?q={0}&source=lnms&tbm=nws'.format(self.term)

    def run (self):
        response = requests.get(self.url)
        print(response.text)
        soup = BeautifulSoup(response.text, 'html.parser')
        headline_results = soup.find_all('div', class_="phYMDf nDgy9d")
        for h in headline_results:
            blob = TextBlob(h.get_text())
            self.sentiment += blob.sentiment.polarity / len(headline_results)
            self.subjectivity += blob.sentiment.subjectivity / len(headline_results)
a = Analysis('Vaccine')
a.run()
print(a.term, 'Subjectivity: ', a.subjectivity, 'Sentiment: ' , a.sentiment)

Результат всегда 0 для настроения и 0 для субъективности. Я чувствую, что проблема в классе _ = "phYMDf nDgy9d".

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

используйте это

headline_results = soup.find_all('div', {'class' : 'BNeawe vvjwJb AP7Wnd'})

, вы уже распечатали файл response.text, если вы хотите найти указанные данные c, выполните поиск из результата response.text

2 голосов
/ 22 марта 2020

Если вы перейдете по этой ссылке, вы увидите законченное состояние страницы, но requests.get не выполняет и не загружает больше данных, кроме запрашиваемой вами страницы. К счастью, есть некоторые данные, и вы можете их очистить. Я предлагаю вам использовать html сервисы prettifier, такие как codebeautify , чтобы лучше понять структуру страницы.

Также, если вы видите такие классы, как phYMDf nDgy9d, обязательно избегайте поиска с помощью их. Это минимизированные версии классов, поэтому в любой момент, если они изменят часть кода CSS, класс, который вы ищете, получит новое имя.

То, что я сделал, вероятно, излишне, но, Мне удалось выкопать, чтобы очистить определенные c частей, и ваш код работает сейчас.

enter image description here

Когда вы смотрите на более красивую версию запрошенного html file, необходимое содержимое в div с идентификатором main, показанным выше. Затем его дети начинают с элемента div Поиск Google, продолжают элемент style и после одного пустого элемента div появляются элементы post div. Последние два элемента в этом дочернем списке являются элементами footer и script. Мы можем обрезать их с помощью [3:-2], а затем под этим деревом у нас будут чистые данные (в значительной степени). Если вы проверите оставшуюся часть кода после переменной posts, вы поймете это, я думаю.

Вот код:

from textblob import TextBlob
import requests, re
from bs4 import BeautifulSoup
from pprint import pprint

class Analysis:
    def __init__(self, term):
        self.term = term
        self.subjectivity = 0
        self.sentiment = 0
        self.url = 'https://www.google.com/search?q={0}&source=lnms&tbm=nws'.format(self.term)

    def run (self):
        response = requests.get(self.url)
        #print(response.text)
        soup = BeautifulSoup(response.text, 'html.parser')
        mainDiv = soup.find("div", {"id": "main"})
        posts = [i for i in mainDiv.children][3:-2]
        news = []
        for post in posts:
            reg = re.compile(r"^/url.*")
            cursor = post.findAll("a", {"href": reg})
            postData = {}
            postData["headline"] = cursor[0].find("div").get_text()
            postData["source"] = cursor[0].findAll("div")[1].get_text()
            postData["timeAgo"] = cursor[1].next_sibling.find("span").get_text()
            postData["description"] = cursor[1].next_sibling.find("span").parent.get_text().split("· ")[1]
            news.append(postData)
        pprint(news)
        for h in news:
            blob = TextBlob(h["headline"] + " "+ h["description"])
            self.sentiment += blob.sentiment.polarity / len(news)
            self.subjectivity += blob.sentiment.subjectivity / len(news)
a = Analysis('Vaccine')
a.run()

print(a.term, 'Subjectivity: ', a.subjectivity, 'Sentiment: ' , a.sentiment)

Несколько выводов:

[{'description': 'It comes after US health officials said last week they had '
                 'started a trial to evaluate a possible vaccine in Seattle. '
                 'The Chinese effort began on...',
  'headline': 'China embarks on clinical trial for virus vaccine',
  'source': 'The Star Online',
  'timeAgo': '5 saat önce'},
 {'description': 'Hanneke Schuitemaker, who is leading a team working on a '
                 'Covid-19 vaccine, tells of the latest developments and what '
                 'needs to be done now.',
  'headline': 'Vaccine scientist: ‘Everything is so new in dealing with this '
              'coronavirus’',
  'source': 'The Guardian',
  'timeAgo': '20 saat önce'},
 .
 .
 .
Vaccine Subjectivity:  0.34522727272727277 Sentiment:  0.14404040404040402
[{'description': '10 Cool Tech Gadgets To Survive Working From Home. From '
                 'Wi-Fi and cell phone signal boosters, to noise-cancelling '
                 'headphones and gadgets...',
  'headline': '10 Cool Tech Gadgets To Survive Working From Home',
  'source': 'CRN',
  'timeAgo': '2 gün önce'},
 {'description': 'Over the past few years, smart home products have dominated '
                 'the gadget space, with goods ranging from innovative updates '
                 'to the items we...',
  'headline': '6 Smart Home Gadgets That Are Actually Worth Owning',
  'source': 'Entrepreneur',
  'timeAgo': '2 hafta önce'},
 .
 .
 .
Home Gadgets Subjectivity:  0.48007305194805205 Sentiment:  0.3114683441558441

Я использовал заголовки и данные описания для выполнения операций, но вы можете поиграть с ними, если хотите. У вас есть данные сейчас:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...