为了练习,我想在Python中构建一个词频计数器。我决定使用Reddit上一篇文章的标题(如果这不是问题(作为一个例子。对我来说,第一步是从该标题中获取单词,并将它们放入列表中,如下所示:
import requests
from bs4 import BeautifulSoup
def get_words(url):
word_list = []
source_code = requests.get(url).text
soup = BeautifulSoup(source_code, features='html.parser')
for word in soup.find_all('a', {'class': 'title may-blank loggedin'}):
content = word.string
every_word = content.lower().split()
for every in every_word:
print(every)
word_list.append(every)
get_words('https://www.reddit.com/r/nba/comments/hje9ud/kemba_walker_im_a_single_man_with_no_kids_so_ima/')
但是当我运行它时,控制台上没有任何内容运行(即使我决定遍历标题并打印出所有单词(。这有什么原因吗?是因为我使用像Reddit这样的大网站作为例子吗?
您可能收到 502。 取而代之的是:
source_code = requests.get(url).text
你应该这样做:
response = requests.get(url)
assert response.status_code == 200
source_code = response.text
你会看到它失败了。
您需要添加"用户代理"标头。看到这个问题: 使用 Python 中的搜索网站请求时出现 502 错误
即便如此,你的汤选择器也很奇怪。您正在寻找具有"title"类a
元素,但该页面上没有此类元素。您可能应该只获得<h1>
元素。
所以这将起作用:
import requests
from bs4 import BeautifulSoup
def get_words(url):
word_list = []
source_code = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}).text
soup = BeautifulSoup(source_code, features='html.parser')
for word in soup.find_all('h1'):
content = word.string
every_word = content.lower().split()
for every in every_word:
print(every)
word_list.append(every)
get_words('https://www.reddit.com/r/nba/comments/hje9ud/kemba_walker_im_a_single_man_with_no_kids_so_ima/')
我对此进行了测试,它发现了重复的标头,因此可能只使用第一个标头,如下所示:
import requests
from bs4 import BeautifulSoup
def get_words(url):
word_list = []
source_code = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}).text
soup = BeautifulSoup(source_code, features='html.parser')
content = soup.find_all('h1')[0].string
every_word = content.lower().split()
for every in every_word:
print(every)
word_list.append(every)
get_words('https://www.reddit.com/r/nba/comments/hje9ud/kemba_walker_im_a_single_man_with_no_kids_so_ima/')