字典任务。选择所需的并订购

时间:2016-10-27 13:22:11

标签: python function dictionary web

stackoverfollowers!

我正在努力解决一项任务。这是:

  

''写一个函数相同的词(u1,u2,enc,k)

     
      
  1. 拿2个网址和enc ='utf8':
      u1 ='http://...u1 ..'
      u2 =   “http://...u2 ...
  2.   
  3. 在此网页上,u1和u2会在两个页面上找到长度k 的字词
  4.   
  5. 计算每页上出现的单词次数
  6.   
  7. 返回包含3个参数组的列表(见第2段),发生1 (单词出现的次数)在页面u1), occurrence 2 (如何   很多时候,页面上出现一个单词u2)
  8.   
  9. 根据两页“
  10. 上发生的总数,返回的列表应按递减顺序排列   

使用此代码删除所有非字母字符

def mywords(s):              # delet nonalphabetic characters
    for c in '''!?/-,():;--'.\_[]"{}''':
        s = s.replace(c, ' ')
    return s.split()            # return a list of all words from page with my url

import urllib.request as ul

def myurl(u, enc):      #open my url
    p = ul.urlopen(u)
    t = p.read()
    p.close()

    return mywords(t.lower())

然后我遇到困难点3-5并且卡住(主要是因为如果有什么事情没有去,我用 pythontutor.com 在线查看代码但是在这种情况下我不能这样做因为它不支持urllib库)

谢谢!!!

2 个答案:

答案 0 :(得分:0)

在我看来,你需要一个测试环境。 我会在本地机器上安装Python并在IDLE中测试代码,这是一个随Python一起提供的编辑器。

关于你的家庭作业的一些想法。 1.函数myurl读取远程html文件的内容,因为它只是一个文件。 您可以将代码放在read()和close()语句之间。您可以逐行浏览文件,然后逐字逐句查找符合您需求的文字。您可能希望首先使用mywords函数从单词中删除不需要的字符。

希望有所帮助。

答案 1 :(得分:0)

我们不清楚你遇到了什么问题,但是我制作了一个符合规格的程序,它可以作为你的基础。但是,在理解了这一点之后,你应该明确地做出自己的实现。

好的,首先:urllib api从python 2急剧变化到3. HTMLParser类也在不同的地方,具体取决于版本。这意味着如果您希望代码可移植,则必须执行一些额外的工作。从不同的方向来看,我选择隐藏这些问题,方法是使用requests来请求页面,BeautifulSoup来解析其内容。 显然,这是一种权衡,因为您必须安装非本机库:

在你的shell中:

$ pip install requests beautifulsoup4

好处是代码变得很短:

webpage_words_counter_example.py:

import re
from collections import Counter

import requests
from bs4 import BeautifulSoup


def get_words_from_url(url):
    response = requests.get(url)
    response.raise_for_status()

    soup = BeautifulSoup(response.text, "html.parser")
    for script in soup(["script", "style"]):
        script.extract()
    # returns a list of words.
    return re.sub('\W', ' ', soup.get_text()).lower().split()


def samewords(u1, u2, enc, k):
    # Retrieve content, filter words with specified 
    # length and initialize repetition counters.
    w1, w2 = map(Counter,
                 (filter(lambda word: len(word) == k, words)
                  for words in map(get_words_from_url,
                                   (u1, u2))))

    # Map all words to a list of tuples (word, count_w1, count_w2)
    # and sort this list by count_w1 and count_w2.
    return sorted(map(lambda x: (x, w1[x], w2[x]),
                      set(w1.keys()) | set(w2.keys())),
                  # disregard the word itself when sorting,
                  # considering only its occurrence in each text.
                  key=lambda x: x[1:],
                  # reversed array, so most frequent words come first.
                  reverse=True)


if __name__ == '__main__':
    word_count = samewords(
        'https://www.theguardian.com/environment/2016/oct/27/scheme-to-reopen-river-severn-to-fish-wins-almost-20m-in-funding',
        'https://www.theguardian.com/environment/2016/oct/27/world-on-track-to-lose-two-thirds-of-wild-animals-by-2020-major-report-warns',
        'utf-8',
        10
    )

    print('word count:', word_count)