Не удается найти информацию о продукте с помощью xPath - PullRequest
1 голос
/ 01 февраля 2020

Я пишу свой первый веб-скребок в Python и пытаюсь получить название продукта и цену со страницы продукта Ali express. Я совершенно нуб в этом топи c, извините, если это очевидный вопрос, но решения, которые я пробовал так далеко от других постов, не сработали. Я использую xpath для нацеливания html элементов. Я скопировал код xpath из Chrome с помощью элемента inspect -> copy xPath tool. Кажется, что он работает не так, как на других сайтах, потому что вызовы tree.xpath просто возвращают пустые списки. Мне удалось заставить его работать с заголовком методом проб и ошибок, потому что он, кажется, возвращает список, содержащий весь текст на всей странице, а заголовок находится в третьем индексе списка. Я не могу найти индекс цены, а также я хотел бы найти правильный способ сделать это. Я пробовал решения подобных проблем другими людьми, но в моем случае ничего не помогло, и я заблудился. Вот мой код:

import requests
from lxml import html


url = 'https://www.aliexpress.com/item/4000203338045.html?spm=a2g0o.detail.1000060.1.77ce75e1YttKZb&gps-id=pcDetailBottomMoreThisSeller&scm=1007.13339.146401.0&scm_id=1007.13339.146401.0&scm-url=1007.13339.146401.0&pvid=662e2a50-e8d2-4ce3-b66e-70afff126070'

page = requests.get(url)
tree = html.fromstring(page.content)

title = tree.xpath('//*[@id="root"]/div/div[1]/div/div[2]/div[1]')[0]
title_text = title.xpath('///text()')[3]

print('Title:',title)
print('Title text:',title_text)

price = tree.xpath('//*[@id="root"]/div/div[2]/div/div[2]/div[4]/div[1]/span')
print('Price:', price)

А вот и вывод:

Title: <Element div at 0x3f113f0>
Title text: Bluedio T elf 2 Bluetooth earphone TWS wireless earbuds waterproof Sports Headset Wireless Earphone in ear with charging box-in Phone Earphones & Headphones from Consumer Electronics on AliExpress 
Price: []

Я ценю вашу помощь!

1 Ответ

0 голосов
/ 02 февраля 2020

Строки xpath, которые вы ищете:

tree.xpath('//div[@class="product-title"]/text()')
tree.xpath('//div[@class="product-price-current"]//text()')

Однако requests не обрабатывает javascript (вам потребуется селен или spla sh перед копированием). Если вы посмотрите на page.content, то увидите, что искомые слова находятся в документе, но внутри некоторого JSON.

"name":"PageModule",
"ogDescription":"Smarter Shopping, Better Living!  Aliexpress.com",
/* TITLE */
"ogTitle":"US $18.27 70% OFF|Bluedio T elf 2 Bluetooth earphone TWS wireless earbuds waterproof Sports Headset Wireless Earphone in ear with charging box-in Phone Earphones & Headphones from Consumer Electronics on AliExpress ",

"ogurl":"//www.aliexpress.com/item/4000203338045.html",
"oldItemDetailUrl":"https://www.aliexpress.com/item/Bluedio-T-elf-2-Bluetooth-earphone-TWS-wireless-earbuds-waterproof-Sports-Headset-Wireless-Earphone-in-ear/4000203338045.html",
"plazaElectronicSeller":false,
"productId":4000203338045,
"ruSelfOperation":false,
"showPlazaHeader":false,
"siteType":"glo",
"spanishPlaza":false,
"title":"Bluedio T elf 2 Bluetooth earphone TWS wireless earbuds waterproof Sports Headset Wireless Earphone in ear with charging box-in Phone Earphones & Headphones from Consumer Electronics on AliExpress "
},
"preSaleModule":{ 
   "features":{ 

   },
   "i18nMap":{ 

   },
   "id":0,
   "name":"PreSaleModule",
   "preSale":false
},
"priceModule":{ 
   "activity":true,
   "bigPreview":false,
   "bigSellProduct":false,
   "discount":70,
   "discountPromotion":true,
   "features":{ 

   },
   /* PRICE */
   "formatedActivityPrice":"US $18.27",

   "formatedPrice":"US $60.90",
   "hiddenBigSalePrice":false,
   "i18nMap":{ 
      "LOT":"lot",
      "INSTALLMENT":"Installment",
      "DEPOSIT":"Deposit",
      "PRE_ORDER_PRICE":"Pre-order price"
   }

К сожалению, я понимаю, что это не так Вы полностью найдете ответ, который ищете, но, надеюсь, это поможет вам в этом.

...