Как получить значение по умолчанию ноль, если ключ не найден в списке? - PullRequest
0 голосов
/ 29 сентября 2018
for url in urls:
            uClient = ureq(url)
            page_html = uClient.read()
            uClient.close()
            soup = BeautifulSoup(page_html, "html.parser")
            text = (''.join(s.findAll(text=True))for s in soup.findAll('p'))
            c = Counter((re.sub(r"[^a-zA-Z0-9 ]","",x)).strip(punctuation).lower() for y in text for x in y.split())
            for key in sorted(c.keys()):
                l.append([key, c[key]])

        d = collections.defaultdict(list)
        for k, v in l:
            d[k].append(v)

        print(d.items())

Вывод, который я получаю:

([('', [3, 9, 4, 1]), ('1', [1, 2, 2]), ('1960', [1]), ('1974', [1]), ('1996', [1]), ('1997', [1]), ('1998', [1]), ('2001', [2]), ('2002', [1]), ...

Я хочу значение по умолчанию 0, если ключ не найден в списке.Например, если Key: g 1 раз в первом списке, 0 во втором, 3 в третьем и 6 в четвертом.Он должен вернуть: 'g': [1,0,3,6]

Редактировать:

Это закомментированные строки из моего полного кода, чтобы показать испытания, которые не сработали:

        #m = list(map(dict, map(zip, list_1, list_2)))    
        #matrix = pd.DataFrame.from_dict(d, orient='index')
        matrix = pd.DataFrame({ key:pd.Series(value) for key, value in d.items() })

У меня есть текстовый файл с именем 'urls.txt', который содержит URL:

https://en.wikipedia.org/wiki/Data_science
https://datajobs.com/what-is-data-science

Мне нужна матрица терминов документа из всех уникальных буквенно-цифровых символов.Скажем, слово данные и наука:
Одна строка должна быть [Document number, term 'data', term 'science']
Она должна выглядеть следующим образом:

   data   science
1  96      65
2  105     22
3  0       16

Я очень близко, но не могу сделать это правильно.Попробовал список на dataframe, продиктовал dataframe, чисто на dataframe, но ничего не получалось.Искал везде, не мог найти подобную вещь.

1 Ответ

0 голосов
/ 01 октября 2018

Я отвечаю на свой вопрос, так как могу найти способ сделать это и опубликовать его здесь на случай, если кому-то понадобится помощь:

import requests
from bs4 import BeautifulSoup
import collections
from string import punctuation
from urllib.request import urlopen as ureq
import re
import pandas as pd
import numpy as np
import operator
Q1= open ("Q1.txt", "w") 
def web_parsing(filename):
    with open (filename, "r") as df:
        urls = df.readlines()
        url_number = 0 
        url_count = []
        l = {} 
        d = []
        a =[]
        b = []
        e=[]
        for url in urls:
            uClient = ureq(url)
            page_html = uClient.read()
            uClient.close()
            soup = BeautifulSoup(page_html, "html.parser")
            text = (''.join(s.findAll(text=True))for s in soup.findAll('p'))
            c = Counter((re.sub(r"[^a-zA-Z0-9 ]","",x)).strip(punctuation).lower() for y in text for x in y.split())
            for key in c.keys():
                if key in a:
                    continue
                else:
                    a.append(key)
            #print(sorted(a))
            a = list(filter(None, a))
            #print(sorted(a))
            stopfile = open('stop_words.txt', 'r')
            stopwords = [line.split(',') for line in stopfile.readlines()]
            #print(stopwords)
            a = [item for item in a if item not in stopwords]
            #print(len(a))
            l = [list(([word, c[word]])) for word in a]
            l =sorted(l)
            flat_list = [item for sublist in l for item in sublist]
            d.extend(flat_list)
            b = {d[i]: d[i+1] for i in range(0, len(d), 2)}
            e.append(b)
        j=0
        for url in urls:
            j = j+1
        #print(j)
        result = {}
        for key in a:
            for i in range(0,j):
                if key in e[i]: result.setdefault(key, []).append(e[i][key])
                if key not in e[i]: result.setdefault(key, []).append(0)
            #print (result)
            #print (result)
        od = collections.OrderedDict(sorted(result.items()))
        #print(od)
        df1 = pd.DataFrame(od)
        df2 =df1.loc[:, ['data', 'companies', 'business', 'action', 'mining', 'science']]
        #return(df2)
        df1.to_csv(Q1, header=True)
        df2.to_csv(Q1,  header=True)        
        print(len(a))
        return(df1)
...