计算特定单词在特定 URL - Python 上的出现频率
Count the frequency of a specific word on a specific URL - Python
我希望统计特定单词在给定 URL 上出现的频率。我目前有一种方法可以针对一小部分 URL 和一个单词执行此操作:
import requests
from bs4 import BeautifulSoup
url_list = ["https://www.example.org/","https://www.example.com/"]
#the_word = input()
the_word = 'Python'
total_words = []
for url in url_list:
r = requests.get(url, allow_redirects=False)
soup = BeautifulSoup(r.content.lower(), 'lxml')
words = soup.find_all(text=lambda text: text and the_word.lower() in text)
count = len(words)
words_list = [ ele.strip() for ele in words ]
for word in words:
total_words.append(word.strip())
print('\nUrl: {}\ncontains {} of word: {}'.format(url, count, the_word))
print(words_list)
#print(total_words)
total_count = len(total_words)
但是,我希望能够将一组映射到它们各自 URL 的单词执行此操作,如下面的数据框所示。
Target Word
Target URL
word1
www.example.com/topic-1/
word2
www.example.com/topic-2/
理想情况下,输出会给我一个新列,其中包含该词在其关联 URL 上显示的频率。例如,'word1' 在 'www.example.com/topic-1/'.
上的展示频率
非常感谢任何帮助!
您应该尝试 count() 字符串的方法
使用您的代码,它将如下所示:
count = url.count(the_word)
print('\nUrl: {}\ncontains {} of word: {}'.format(url, count, the_word))
只需遍历您的结构 - 字典、字典列表...以下示例将仅指向一个方向,导致您的问题不是那么清楚并且缺少确切的预期结果。我相信您可以根据自己的特殊需要对其进行调整。
例子
import requests
from bs4 import BeautifulSoup
import pandas as pd
data = [
{'word':'Python','url':'https://whosebug.com/questions/tagged/python'},
{'word':'Question','url':'https://whosebug.com/questions/tagged/python'}
]
for item in data:
r = requests.get(item['url'], allow_redirects=False)
soup = BeautifulSoup(r.content.lower(), 'lxml')
count = soup.body.get_text(strip=True).lower().count(item['word'].lower())
item['count'] = count
pd.DataFrame(data)
输出
word
url
count
Python
https://whosebug.com/questions/tagged/python
93
Question
https://whosebug.com/questions/tagged/python
13
注意: 根据你想确定的词频,你应该考虑以下几点:
- 人类可读的内容将与 html 分开提取,例如BeautifulSoup.
- 根据网页内容的静态/动态方式,必须选择工具。例如,对于动态内容,selenium 是首选,因为与请求不同,它还呈现 JavaScript.
我希望统计特定单词在给定 URL 上出现的频率。我目前有一种方法可以针对一小部分 URL 和一个单词执行此操作:
import requests
from bs4 import BeautifulSoup
url_list = ["https://www.example.org/","https://www.example.com/"]
#the_word = input()
the_word = 'Python'
total_words = []
for url in url_list:
r = requests.get(url, allow_redirects=False)
soup = BeautifulSoup(r.content.lower(), 'lxml')
words = soup.find_all(text=lambda text: text and the_word.lower() in text)
count = len(words)
words_list = [ ele.strip() for ele in words ]
for word in words:
total_words.append(word.strip())
print('\nUrl: {}\ncontains {} of word: {}'.format(url, count, the_word))
print(words_list)
#print(total_words)
total_count = len(total_words)
但是,我希望能够将一组映射到它们各自 URL 的单词执行此操作,如下面的数据框所示。
Target Word | Target URL |
---|---|
word1 | www.example.com/topic-1/ |
word2 | www.example.com/topic-2/ |
理想情况下,输出会给我一个新列,其中包含该词在其关联 URL 上显示的频率。例如,'word1' 在 'www.example.com/topic-1/'.
上的展示频率非常感谢任何帮助!
您应该尝试 count() 字符串的方法 使用您的代码,它将如下所示:
count = url.count(the_word)
print('\nUrl: {}\ncontains {} of word: {}'.format(url, count, the_word))
只需遍历您的结构 - 字典、字典列表...以下示例将仅指向一个方向,导致您的问题不是那么清楚并且缺少确切的预期结果。我相信您可以根据自己的特殊需要对其进行调整。
例子
import requests
from bs4 import BeautifulSoup
import pandas as pd
data = [
{'word':'Python','url':'https://whosebug.com/questions/tagged/python'},
{'word':'Question','url':'https://whosebug.com/questions/tagged/python'}
]
for item in data:
r = requests.get(item['url'], allow_redirects=False)
soup = BeautifulSoup(r.content.lower(), 'lxml')
count = soup.body.get_text(strip=True).lower().count(item['word'].lower())
item['count'] = count
pd.DataFrame(data)
输出
word | url | count |
---|---|---|
Python | https://whosebug.com/questions/tagged/python | 93 |
Question | https://whosebug.com/questions/tagged/python | 13 |
注意: 根据你想确定的词频,你应该考虑以下几点:
- 人类可读的内容将与 html 分开提取,例如BeautifulSoup.
- 根据网页内容的静态/动态方式,必须选择工具。例如,对于动态内容,selenium 是首选,因为与请求不同,它还呈现 JavaScript.