因此,我个人项目的目标是创建单词列表以及这些单词在网页上的出现频率。我在https://www.geeksforgeeks.org/python-program-crawl-web-page-get-frequent-words/处找到了一个不错的指南,但该指南似乎仅适用于他们提供的网站。我希望我的单词列表程序实际上能够从真实网站中抓取单词。我遇到了HTTP错误403一段时间,但找到了解决该问题的方法。我现在必须更改什么才能实际刮除该网站以外的其他网站?我的感觉是它与BSOBJ汤findAll或其他东西有关。我通过了另一部分,但现在有点卡住了
这是我的python3代码。
import sys
import requests
from bs4 import BeautifulSoup
import operator
from urllib.request import Request, urlopen
def get_words(target):
wordsl = []
req = Request(target,headers={'User-Agent':'Mozilla/5.0'})
source = urlopen(req).read() #requests.get(target).text
soup = BeautifulSoup(source,'html.parser')
for text in soup.findAll('div',{'class':'entry-content'}):
content = text.text
words = content.lower().split()
for word in words:
wordsl.append(word)
clean_list(wordsl)
def clean_list(wordlist):
clean = []
bad = '!@#$%^&*()_-=+{}[]\|"<>,.:;?/ '
for word in wordlist:
for i in range(0,len(bad)):
word=word.replace(bad[i],'')
if len(word) > 0:
clean.append(word)
add_count(clean)
def add_count(final_words):
word_count = {}
for word in final_words:
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
output(word_count)
def output(words):
#words = sorted(words.values())
for x in words:
print(x,':',words[x])
if __name__ == '__main__':
get_words(sys.argv[1])
答案 0 :(得分:0)
此行:
for text in soup.findAll('div',{'class':'entry-content'}):
确定程序在哪些HTML元素中查找单词。
具体来说,从存储在soup
对象中的经过解析的HTML树中,仅考虑div
为class
的{{1}}元素。这特定于托管指南的geeksforgeeks网站,其中包括HTML源,例如:
entry-content
但是其他网站根本不需要使用类<div class="entry-content">
<p>The task is to count the most frequent words...
。因此,没有元素可以匹配您的entry-content
调用。
可以在许多网站上使用的一种可能的假设是,可以在soup.findAll
(段落)标记中找到文本。
因此,您可以将<p>
行更改为以下内容:
soup.findAll
通过这种方式,网页中任何for text in soup.findAll('p'):
标签下的所有文本都将被视为单词频率计数。
我在两页知名网站上尝试了上述方法:
似乎输出单词频率。
您可以尝试更多站点。如果您不想“调试”为什么无法在特定网站中看到任何字词,请在浏览器中访问该网站,并使用“查看页面源代码”(在右键菜单中),然后按Ctrl + F,查找包含该网站上文本的HTML标签。