Удаление ссылок с веб-сайта с использованием Python / Beautiful Soup для аддона Kodi - PullRequest
1 голос
/ 07 июня 2019

Веб-сайт, с которого я пытаюсь очистить медиа-ссылки (для аддона Kodi), не имеет большого количества маркеров классов и т. Д., Но каждая ссылка имеет своего рода уникальный макет.

Я создал базовый аддон Kodi из другого рабочего, но у меня возникают проблемы с тем, что Python / BeautifulSoup очищает ссылки.Другие аддоны используют заголовки классов и т. Д., Но сайт, который я пытаюсь почистить, не очень-то использует это.

Я перепробовал все виды форумов без удачи, большинство KodiФорумы аддонов старые и не очень активные.Руководства, на которые я смотрел, очень быстро переходят от шага 1 к шагу 1000, и примеры, которые он дает, не актуальны.Я посмотрел на 30 или около того разных аддонов, думая, что это должно помочь, но я не могу разобраться.

Ссылки на медиа, названия эпизодов, описания и изображения, которые я пытаюсь почистить, перечислены в www.thisiscriminal.com / episodes

Полный аддон, который я сделал до сих пор, находится в Github-хранилище

Я могу видеть в источникеони четко изложены (см. код)

Мне просто нужно иметь возможность анализировать веб-сайт, находить приведенные ниже биты для каждого эпизода, заполнять их ссылками на странице дополнения коди и затем перечислять следующийодин под.Любая помощь будет принята с благодарностью.Я потратил около 3 дней подряд, пытаясь это сделать, и очень и очень рад, и раздражен тем, что выпал из той степени, которую я получил в 2002 году.

КОД ВЕБ-САЙТА, ​​КОТОРЫЙ Я ДОЛЖЕН ТЯНУТЬ

(episode image)
<img width="300" height="300" ...
https://thisiscriminal.com/wp-content/uploads/2019/05/Cecilia_art.png" ../>    

(episode title)
<h3><a href="https://thisiscriminal.com/episode-115-cecilia-5-24-19/">Cecilia</a></h3>

(episode number)
<h4>Episode #115</h4>

(episode link)
<p><a href="https://dts.podtrac.com/redirect.mp3/dovetail.prxu.org/criminal/a91a9494-fb45-48c5-ad4c-2615bfefd81b/Episode_115_Cecilia_Part_1.mp3"

(episode description)
</header>When Cecilia....</article>

КОД

import requests
import re
from bs4 import BeautifulSoup

def get_soup(url):
    """
    @param: url of site to be scraped
    """
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'html.parser')

    print "type: ", type(soup)
    return soup

get_soup("https://thisiscriminal.com/episodes")

def get_playable_podcast(soup):
    """
    @param: parsed html page
    """
    subjects = []

    for content in soup.find_all('a'):

        try:
            link = content.find('<p><a href="https://dts.podtrac.com/redirect.mp3/dovetail.prxu.org/criminal/')
            link = link.get('href')
            print "\n\nLink: ", link

            title = content.find('<h4>Episode ')
            title = title.get_text()

            desc = content.find('div', {'class': 'summary'})
            desc = desc.get_text()


            thumbnail = content.find('img')
            thumbnail = thumbnail.get('src')
        except AttributeError:
            continue


        item = {
                'url': link,
                'title': title,
                'desc': desc,
                'thumbnail': thumbnail
        }

        #needto check that item is not null here
        subjects.append(item)

    return subjects

2019-06-09 00: 05: 35.719 T: 1916360240 ОШИБКА: Элемент управления 55 в окне 10502 был задан для фокусировки, но он не может 2019-06-0900: 05: 41.312 T: 1165988576 ОШИБКА: ИСКЛЮЧЕНО Сгенерировано (PythonToCppException): -> Обратный вызов / скрипт Python возвратил следующую ошибку <- - ПРИМЕЧАНИЕ: ОТКАЗ ОТ ЭТОГО МОЖЕТ ПРИВЕСТИ К УТЕЧКАМ ПАМЯТИ!Тип ошибки: ошибка Содержание: кодек «ascii» не может декодировать байт 0xa0 в позиции 0: порядковый номер не находится в диапазоне (128) Трассировка (последний последний вызов): файл »/home/osmc/.kodi/addons/plugin.audio.abcradionational / addon.py ", строка 44, в desc = soup.get_text (). replace ('\ xa0', '') .replace ('\ n', '') UnicodeDecodeError: кодек ascii не можетдекодировать байт 0xa0 в позиции 0: порядковый номер не находится в диапазоне (128) -> Отчет об ошибке конца скрипта Python <- 2019-06-09 00: 05: 41.636 T: 1130349280 ОШИБКА: GetDirectory - Ошибка при получении плагина: // плагин.audio.abcradionational / 2019-06-09 00: 05: 41.636 T: 1916360240 ОШИБКА: CGUIMediaWindow :: GetDirectory (плагин: //plugin.audio.abcradionational/) завершилась неудачно </p>

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Хорошей новостью является то, что страница получает загрузку исходного кода wp json для контента, и вы можете использовать простой xhr для этого. Другой ответ, кажется, хорошо описывает, как найти это.

Затем вы можете анализировать информацию, как вам требуется от этого JSON. Текстовое описание имеет вид html в json, поэтому вы можете передать его в bs4 и проанализировать при необходимости. Пример ниже. Вы можете исследовать объект json в отношении Сесилии здесь или вставить следующее в средство просмотра json:

{'title': 'Cecilia', 'excerpt': {'short': 'When Cecilia Gentili was growing up in Argentina, she felt so different from everyone around her that she thought she might be from another...', 'long': "When Cecilia Gentili was growing up in Argentina, she felt so different from everyone around her that she thought she might be from another planet. “Some of us find our community with our own family and some of us don't.” Sponsors: Article Visit article.com/criminal to get $50 off your...", 'full': "When Cecilia Gentili was growing up in Argentina, she felt so different from everyone around her that she thought she might be from another planet. “Some of us find our community with our own family and some of us don't.” Sponsors: Article Visit article.com/criminal to get $50 off your first purchase..."}, 'content': '<p data-pm-context="[]">When Cecilia Gentili was growing up in Argentina, she felt so different from everyone around her that she thought she might be from another planet. “Some of us find our community with our own family and some of us don&#8217;t.”</p>\n<p data-pm-context="[]">Sponsors:</p>\n<p><strong>Article</strong> Visit <a href="http://article.com/criminal">article.com/criminal </a>to get $50 off your first purchase of $100 or more.</p>\n<p><a href="https://www.therealreal.com/"><strong>The Real Real</strong></a> Shop in-store, online, or download the app, and get 20% off select items with the promo code REAL.</p>\n<p><strong>Simplisafe</strong> Protect your home today and get free shipping at <a href="http://SimpliSafe.com/CRIMINAL">SimpliSafe.com/CRIMINAL</a></p>\n<p><strong>Squarespace</strong> Try <a href="http://Squarespace.com/criminal">Squarespace.com/criminal </a>for a free trial and when you’re ready to launch, use the offer code INVISIBLE to save 10% off your first purchase of a website or domain.</p>\n<p><strong>Sun Basket</strong> Go to <a href="http://sunbasket.com/criminal">sunbasket.com/criminal </a>to get up to $80 off today!</p>\n', 'image': {'thumb': 'https://thisiscriminal.com/wp-content/uploads/2019/05/Cecilia_art-150x150.png', 'medium': 'https://thisiscriminal.com/wp-content/uploads/2019/05/Cecilia_art-300x300.png', 'large': 'https://thisiscriminal.com/wp-content/uploads/2019/05/Cecilia_art-1024x1024.png', 'full': 'https://thisiscriminal.com/wp-content/uploads/2019/05/Cecilia_art.png'}, 'episodeNumber': '115', 'audioSource': 'https://dts.podtrac.com/redirect.mp3/dovetail.prxu.org/criminal/a91a9494-fb45-48c5-ad4c-2615bfefd81b/Episode_115_Cecilia_Part_1.mp3', 'musicCredits':"FALSE", 'id': 3129, 'slug': 'episode-115-cecilia-5-24-19', 'date': '2019-05-24 19:43:44', 'permalink': 'https://thisiscriminal.com/episode-115-cecilia-5-24-19/', 'next':"None", 'prev': {'slug': 'episode-114-philip-and-becky', 'title': 'Episode 114: Philip and Becky (5.10.2019)'}}

Запрос представляет собой URL-адрес queryString, поэтому вы можете изменить количество возвращаемых элементов, а в ответе вы увидите общее количество страниц, чтобы вы знали, сколько запросов требуется для возврата всего содержимого.

Если вы посмотрите здесь

posts=1000&page=1

вы можете увидеть два параметра, которые вы можете изменить соответственно.

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://thisiscriminal.com/wp-json/criminal/v1/episodes?posts=1000&page=1').json()

for post in r['posts']:
    title = post['title']
    soup = bs(post['content'])
    desc = soup.select_one('p').text  # soup.get_text().replace('\xa0', ' ').replace('\n', ' ')
    img = post['image']['full']
    episode_link = post['audioSource'] #sure this is what you wanted?
    episode_number = post['episodeNumber']
0 голосов
/ 07 июня 2019

Как указал Джек, ответ на странице содержит код JavaScript, который делает вызовы AJAX.Этот код включен в ответ на странице, но не выполняется

Хотя позволит сделать это для вас, я бы предложил альтернативу.

Перейдите на страницу с помощью любого браузера (показан Chrome).Нажмите F12 , чтобы открыть Инструменты разработчика

Developer Tools Open

Нас интересует вкладка "Сеть".Выберите XHR.Теперь, когда Инструменты разработчика открыты, нажмите Ctrl + R , чтобы перезагрузить страницу и зарегистрировать запросы XHR.

Вы должны увидеть что-то вроде этого:

Dev Tools XHR

Вы можете проверить каждый.Я думаю, что вас заинтересует конечная точка / episodes:

Preview

Это структурированный, а более конкретно, ответ JSON.Чтобы использовать эту конечную точку, вы просто должны сделать идентичный запрос GET с .

. Это можно сделать просто:

  1. Щелкните правой кнопкой мыши ответ
  2. Выбор Копировать -> Копировать как cURL (Выберите cURL (Bash), если есть возможность выбора)
  3. Вставьте его в Конвертер cURL
...