使用 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 次。你自己测试一下,看看哪个适合你。
我想计算一个特定网站中的单词列表的频率。然而,该代码没有 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 次。你自己测试一下,看看哪个适合你。