#python #lxml #discord
#python #lxml #Discord
Вопрос:
Я использую lxml для извлечения продуктов из множества розничных продавцов и отправки информации на сервер discord. Я сделал большую часть этого, помимо очистки ссылки (для изображения и т. Д.: https://i5.walmartimages.com/asr/b05aca03-968b-4e43-8b48-781aa52ef3e0_1.7fa663da8e1c382271e6649007e9a60b.png?odnHeight=450amp;odnWidth=450amp;odnBg=FFFFFF )
и текст, чтобы получить название товара и цену.
вот изображение того, как будет выглядеть веб-хук для встраивания discord
Продукт, который я пытаюсь очистить:https://www.walmart.com/ip/POP/295232252
пример элемента, из которого я пытаюсь извлечь изображение: (src =)
<img class="hover-zoom-hero-image" src="https://i5.walmartimages.com/asr/b05aca03-968b-4e43-8b48-781aa52ef3e0_1.7fa663da8e1c382271e6649007e9a60b.png?odnHeight=450amp;amp;odnWidth=450amp;amp;odnBg=FFFFFF" alt="Funko POP! Marvel: Avengers Endgame -amp;nbsp;Ronin">
пример элемента, из которого я пытаюсь извлечь текст: (содержимое =)
<h1 class="prod-ProductTitle no-margin font-normal heading-a" itemprop="name" content="Funko POP! Marvel: Avengers Endgame -amp;nbsp;Ronin"><div>Funko POP! Marvel: Avengers Endgame -amp;nbsp;Ronin</div></h1>
Мой код:
def send_embed(link):
embed = Embed(
description=link,
color=color_embed,
timestamp='now' # sets the timestamp to current time
)
image1 = 'https://www.blakleysflooring.com/wp-content/uploads/2016/03/Placeholder.png'
image2 = pic
embed.set_author(name=itemName "|" price, url=link)
embed.add_field(name='Retailer', value=site)
embed.add_field(name='Stock', value=instock)
embed.set_footer(text='@QuantumPings')
embed.set_thumbnail(image2)
hook.send(embed=embed)
def getDatetime():
return '[{}]'.format(str(datetime.datetime.now())[:-3])
def monitor(link):
global embed
global itemName
global pic
global site
global instock
global price
global color_embed
try:
with session as s:
r = s.get(link, timeout=10)
r.raise_for_status()
tree = etree.HTML(r.content)
if 'walmart' in link:
oos = False if tree.xpath('//span[@class="button-wrapper"]') else True
site = 'Walmart'
instock = False if tree.xpath('/html/body/div[2]/div/div/div[2]/div/div[1]/div/div[1]/div/div/div/div/div[3]/div[4]/div[2]/div[1]/div/div/div/div[4]/div/div/div[2]/div/div/div/span') else False
pic = ()
itemName = tree.xpath('//div[@class="ProductTitle"]/h2/div/text()')
price = '$0.00'
color_embed = 0x00f714 if instock is True else 0xff0008
True else 0xff0008
Комментарии:
1. Вы бы согласились использовать
BeautifulSoup
вместо этого? Я не работал сlxml
, но синтаксический анализ текста сBeautifulSoup
— это ez-pz2. @Reedinationer я бы предпочел этого не делать, но если дойдет до этого, я думаю, я мог бы.
Ответ №1:
Вот базовый пример того, как использовать lxml
для сбора текста / ссылок. Вы можете практически все, что угодно, с lxml
так что наверняка экспериментируйте. И, кстати, я думаю, что lxml
это быстрее, чем BeautifulSoup
, но это не так элегантно. Я бы также перечиталhttps://lxml.de/lxmlhtml.html
from lxml import html
response = """
<h1 class="prod-ProductTitle no-margin font-normal heading-a" itemprop="name" content="Funko POP! Marvel: Avengers Endgame -amp;nbsp;Ronin"><div>Funko POP! Marvel: Avengers Endgame -amp;nbsp;Ronin</div></h1>
<img class="hover-zoom-hero-image" src="https://i5.walmartimages.com/asr/b05aca03-968b-4e43-8b48-781aa52ef3e0_1.7fa663da8e1c382271e6649007e9a60b.png?odnHeight=450amp;amp;odnWidth=450amp;amp;odnBg=FFFFFF" alt="Funko POP! Marvel: Avengers Endgame -amp;nbsp;Ronin">
"""
tree = html.fromstring(response)
title = [e for e in tree.cssselect('h1') if e.get('itemprop') is not None and e.get('itemprop') == 'name']
title = title[0]
title = title.text_content()
print (title)
img = tree.cssselect('img.hover-zoom-hero-image')
img = img[0]
img = img.get('src')
print (img)
Комментарии:
1. проблема в том, что мне нужно, чтобы он работал с большим количеством ссылок, и я не хотел бы размещать элементы по отдельности для каждого продукта. Имя_элемента = у меня не работает, на данный момент я получаю сообщение об ошибке «можно объединить только список (не «str) в список» в моей настройке
2. Я
itemprop
неitemname
использую? И если вы запрашиваете сразу несколько URL-адресов, используйте что-то вродеaiohttp
, но это не изменит способ сбораtitle
/link
.