Если вы перейдете по этой ссылке, вы увидите законченное состояние страницы, но requests.get
не выполняет и не загружает больше данных, кроме запрашиваемой вами страницы. К счастью, есть некоторые данные, и вы можете их очистить. Я предлагаю вам использовать html сервисы prettifier, такие как codebeautify , чтобы лучше понять структуру страницы.
Также, если вы видите такие классы, как phYMDf nDgy9d
, обязательно избегайте поиска с помощью их. Это минимизированные версии классов, поэтому в любой момент, если они изменят часть кода CSS, класс, который вы ищете, получит новое имя.
То, что я сделал, вероятно, излишне, но, Мне удалось выкопать, чтобы очистить определенные c частей, и ваш код работает сейчас.
Когда вы смотрите на более красивую версию запрошенного 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
Я использовал заголовки и данные описания для выполнения операций, но вы можете поиграть с ними, если хотите. У вас есть данные сейчас:)