使用 Python 计算网站中词频的代码未输出正确的频率

code for counting word frequency in website using Python doesn't output the right frequency

我想计算一个特定网站中的单词列表的频率。然而,该代码没有 return 手动“control F”命令的确切字数。 我做错了什么?

这是我的代码:

import pandas as pd
from bs4 import BeautifulSoup
import requests
from selenium import webdriver
import re

url='https://www.gov.uk/government/publications/specialist-quality-mark-tender-2016'
fr=[] 
wanted = ['tender','2020','date']    
for word in wanted:
    a=requests.get(url).text.count(word)
    dic={'phrase':word,
          'frequency':a,              
            }          
    fr.append(dic)  
    print('Frequency of',word, 'is:',a)
data=pd.DataFrame(fr)    

当我在“Tender”这个词上尝试你的代码时,a=requests.get(url).text.count(word) return 比 ctrl + F 得到了更多的结果,这很奇怪,因为我期望 return 更少(text.count 区分大小写,HTML 有时会将元素分成多行等等)。 但是通过打印变量“a”并浏览它,您会注意到页面上没有显示一些元素,而且标签之间有很多“Tender”。 我建议您使用 BeautifulSoup 或找到一些方法来避免浏览不可见的文本。

顺便说一下,小东西,您可以将 requests.get(url).text 作为变量放在循环之外,这样您就不必在每次迭代时都发送请求。

请参阅问题中的评论,了解为什么使用 requests 来计算网页“可见光谱”中某个词的频率(您在浏览器中实际看到的内容)可能不是一个好主意).

如果你想用 selenium 解决这个问题,你可以尝试:

from selenium import webdriver

url = 'https://www.gov.uk/government/publications/specialist-quality-mark-tender-2016'

driver = webdriver.Chrome(chromedriver_location)
driver.get(url)
body = driver.find_element_by_tag_name('body')

fr = [] 
wanted = ['tender', '2020', 'date']    
for word in wanted:
    freq = body.text.lower().count(word) # .lower() to account for count's case sensitive behaviour
    dic = {'phrase': word, 'frequency': freq}          
    fr.append(dic)  
    print('Frequency of', word, 'is:', freq)

这给了我与 CTRL + F 相同的结果。

您也可以通过稍微修改您的代码来测试 BeautifulSoup(顺便导入):

import requests
from bs4 import BeautifulSoup

url = 'https://www.gov.uk/government/publications/specialist-quality-mark-tender-2016'
fr = [] 
wanted = ['tender','2020','date']    
a = requests.get(url).text
soup = BeautifulSoup(a, 'html.parser')
for word in wanted:
    freq = soup.get_text().lower().count(word)
    dic = {'phrase': word, 'frequency': freq}          
    fr.append(dic)  
    print('Frequency of', word, 'is:', freq)

这给了我相同的结果,除了单词 tender,根据 BeautifulSoup 出现了 12 次,而不是 11 次。你自己测试一下,看看哪个适合你。