使用python计算网站词频的代码没有输出正确的频率

jhkqcmku  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(338)

我想计算一个特定网站中单词列表的频率。但是,该代码并没有返回手动“controlf”命令将返回的确切字数。我做错什么了?
这是我的密码:

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)
c8ib6hqw

c8ib6hqw1#

当我在“温柔”这个词上尝试你的代码时, a=requests.get(url).text.count(word) 返回的结果比ctrl+f多得多,这很奇怪,因为我希望返回的结果更少(text.count区分大小写,html有时会将元素分成多行等等)。但是通过打印变量“a”并遍历它,您会注意到页面中没有显示元素,而且标签之间有很多“tender”。我建议你使用beautifulsoup或者找到一些方法来避免看不见的文字。
顺便说一下,小东西,你可以把 requests.get(url).text 作为循环外的变量,这样就不必在每次迭代时都发送请求。

h79rfbju

h79rfbju2#

请参阅问题中的注解,了解为什么要使用 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次。自己测试一下,看看什么适合你。

相关问题