Лучший способ очистить описание товара с помощью BeautifulSoup? - PullRequest
0 голосов
/ 27 июня 2018

Я написал следующий код для получения описания продукта с сайта, используя BeautifulSoup-

def get_soup(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            html = response.content
            return BeautifulSoup(html, "html.parser")
    except Exception as ex:
        print("error from " + url + ": " + str(ex))

def get_product_details(url):
    try:
        soup = get_soup(url)
        prod_details = dict()
        desc_list = soup.select('p ~ ul')
        prod_details['description'] = ''.join(desc_list)
        return prod_details
    except Exception as ex:
        logger.warning('%s - %s', ex, url)

if __name__ == '__main__':
    get_product_details("http://www.aprisin.com.sg/p-748-littletikespoptunesguitar.html")

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

[WARNING] aprisin.py:82 get_product_details() : sequence item 0: expected str instance, Tag found - http://www.aprisin.com.sg/p-748-littletikespoptunesguitar.html

Вывод описания без преобразования описания в строку-

[<ul>
<li>Freestyle</li>
<li>Play along with 5 pre-set tunes: </li>
</ul>, <ul>
<li>Each string will play a note</li>
<li>Guitar has a whammy bar</li>
<li>2-in-1 volume control and power button </li>
<li>Simple and easy to use </li>
<li>Helps develop music appreciation </li>
<li>Requires 3 "AA" alkaline batteries (included)</li>
</ul>]

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Вы пытаетесь присоединиться к списку тегов, но для метода соединения требуются аргументы str. Попробуйте:

''.join([str(i) for i in desc_list])
0 голосов
/ 27 июня 2018

Вы передаете список tags (Объект) вместо строки в join(). join() работает со списком строк. Используйте следующие изменения кода для функции соединения: -

prod_details['description'] = ''.join([tag.get_text() for tag in desc_list])

или

prod_details['description'] = ''.join([tag.string for tag in desc_list])

Если вам нужно описание вместе с html-контентом, вы можете использовать следующее: -

# this will preserve the html tags and indentation.
prod_details['description'] = ''.join([tag.prettify() for tag in desc_list])

или

# this will return the html content as string.
prod_details['description'] = ''.join([str(tag) for tag in desc_list])
0 голосов
/ 27 июня 2018

desc_list - это список bs4.element.Tag. вы должны преобразовать тег в строку:

    desc_list = soup.select('p ~ ul')
    prod_details['description'] = str(desc_list[0])
...