Красивый код спагетти, добавление проблемы - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть код, который позволяет мне тянуть ссылки с некоторых новостных сайтов.Я хочу только тянуть ссылки с названием города - Гданьск.Однако не всегда правильное написание используется в URL-адресах, поэтому мне нужно было указать gdańsk, gdansk и т. Д. Я также хочу получить его с разных сайтов.Я смог добавить больше слов и сайтов, но это заставило меня сделать больше для циклов.Не могли бы вы указать мне, как я могу сделать код более эффективным и коротким?

Второй вопрос: я экспортирую полученные ссылки в файл CSV.Я хочу собрать их там, чтобы позже проанализировать их.Я обнаружил, что если я заменю «w» на «a» в csv = open (plik, «a»), то это должно добавить файл.Вместо этого - ничего не происходит.Когда он просто "w", он перезаписывает файл, но теперь мне нужно

import requests
from bs4 import BeautifulSoup as bs

from datetime import datetime
def data(timedateformat='complete'):

formatdaty = timedateformat.lower()

if timedateformat == 'rokmscdz':
    return (str(datetime.now())).split(' ')[0]
elif timedateformat == 'dzmscrok':
    return ((str(datetime.now())).split(' ')[0]).split('-')[2] + '-' + ((str(datetime.now())).split(' ')[0]).split('-')[1] + '-' + ((str(datetime.now())).split(' ')[0]).split('-')[0]


a = requests.get('http://www.dziennikbaltycki.pl')
b = requests.get('http://www.trojmiasto.pl')

zupa = bs(a.content, 'lxml')
zupka = bs(b.content, 'lxml')


rezultaty1 = [item['href'] for item in zupa.select(" [href*='Gdansk']")]
rezultaty2 = [item['href'] for item in zupa.select("[href*='gdansk']")]
rezultaty3 = [item['href'] for item in zupa.select("[href*='Gdańsk']")]
rezultaty4 = [item['href'] for item in zupa.select("[href*='gdańsk']")]

rezultaty5 = [item['href'] for item in zupka.select("[href*='Gdansk']")]
rezultaty6 = [item['href'] for item in zupka.select("[href*='gdansk']")]
rezultaty7 = [item['href'] for item in zupka.select("[href*='Gdańsk']")]
rezultaty8 = [item['href'] for item in zupka.select("[href*='gdańsk']")]

s = set()

plik = "dupa.csv"
csv = open(plik,"a")


for item in rezultaty1:
    s.add(item)
for item in rezultaty2:
    s.add(item)
for item in rezultaty3:
    s.add(item)
for item in rezultaty4:
    s.add(item)
for item in rezultaty5:
    s.add(item)
for item in rezultaty6:
    s.add(item)
for item in rezultaty7:
    s.add(item)
for item in rezultaty8:
    s.add(item)



for item in s:
    print('Data wpisu: ' + data('dzmscrok'))
    print('Link: ' + item)
    print('\n')
    csv.write('Data wpisu: ' + data('dzmscrok') + '\n')
    csv.write(item + '\n'+'\n')

1 Ответ

0 голосов
/ 02 апреля 2019

В идеале, чтобы повысить производительность и сократить код еще дальше от многократного зацикливания, вы можете проанализировать результаты своих веб-страниц и нормализовать их, заменив все специальные символы эквивалентами ASCII ( Замена специальных символов эквивалентами ASCII ) .

Вы можете избежать повторения, изменив свой код так, чтобы он зацикливался на Gdansk вариациях, а затем объединял результаты в один набор. Я изменил ваш код ниже и разделил его на несколько функций.

import requests
from bs4 import BeautifulSoup as bs
from datetime import datetime

def extract_links(content):
    # Return a list of hrefs that mention any variation of the city Gdansk
    variations = ['Gdansk', 'gdansk', 'Gdańsk', 'gdańsk']
    result = []
    for x in variations:
        result = [*result, *[item['href'] for item in content.select(f"[href*={x}]")]]
    return result

def data(timedateformat='complete'):
    formatdaty = timedateformat.lower()

    if timedateformat == 'rokmscdz':
        return (str(datetime.now())).split(' ')[0]
    elif timedateformat == 'dzmscrok':
        return ((str(datetime.now())).split(' ')[0]).split('-')[2] + '-' + ((str(datetime.now())).split(' ')[0]).split('-')[1] + '-' + ((str(datetime.now())).split(' ')[0]).split('-')[0]

def get_links_from_urls(*urls):
    # Request webpages then loop over the results to
    # create a set of links that we will write to our file.
    result = []
    for rv in [requests.get(url) for url in urls]:
        zupa = bs(rv.content, 'lxml')
        result = [*result, *extract_links(zupa)]
    return set(result)

def main():
    # use pytons context manager to open 'ass.csv' and write out csv rows
    plik = "dupa.csv"

    with open(plik, 'a') as f:
        for item in get_links_from_urls('http://www.dziennikbaltycki.pl', 'http://www.trojmiasto.pl'):
            print('Data wpisu: ' + data('dzmscrok'))
            print('Link: ' + item)
            print('\n')
            f.write(f'Data wpisu: {data("dzmscrok")},{item}\n')

main()

Надеюсь, это поможет, дайте мне знать, если у вас есть какие-либо проблемы в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...