Python: извлечение xpath не работает в цикле

#python-3.x #web-scraping #beautifulsoup #lxml #python-webbrowser

Вопрос:

У меня есть список python, содержащий эти пять ссылок:

 https://en-ae.namshi.com/brands/buy-a-little-lovely-company-little-angel-light-w1030269a.html
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-rose-bud-teething-ring-w1030273a.html
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-cloud-projector-light-w869154a.html
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-bunny-projector-light-w869153a.html
https://en-ae.namshi.com/brands/buy-a-little-lovely-company-little-fairy-light-w1030270a.html
 

Я пытаюсь перебирать ссылки , чтобы извлечь определенные элементы со страницы, извлечение отлично работает для большинства элементов, но я не могу получить «РЕЙТИНГ» и «NUM_REVIEWS» с веб-страницы для заполнения столбца. Может кто-нибудь, пожалуйста, помочь мне получить это. Спасибо

Рабочий код:

 import pandas as pd 
import requests
from bs4 import BeautifulSoup
from lxml import html
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}

list_urls = [
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-little-angel-light-w1030269a.html',
'https://en-ae.namshi.com/buy-american-eagle-straight-dark-wash-jeans-w925887a.html',
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-rose-bud-teething-ring-w1030273a.html',
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-cloud-projector-light-w869154a.html',
]

all_data = []
for lnk in list_urls:
    page=requests.get(lnk)
    tree = html.fromstring(page.content)
    f = requests.get(lnk, headers=headers).text
    hun = BeautifulSoup(f,'html.parser')

    product_name=hun.find("h1",{"class":"product__name"}).text.replace('n',"")
    brand_name = hun.find("h2",{"class":"product__brandname"}).text.replace('n',"")

    price = str(tree.xpath('//*[@id="content"]/div/div[3]/section[1]/div/div[1]/div/div[2]/header/div/p[1]/span[1]/text()')[0])
    reduced_price = str(tree.xpath('//*[@id="content"]/div/div[3]/section[1]/div/div[1]/div/div[2]/header/div/p[1]/span[2]/text()')[0])
    rating = str(tree.xpath('/html/body/div[1]/div[7]/div/div[3]/section[1]/div/div[2]/div/div[1]/text()'))
    num_reviews = str(tree.xpath('/html/body/div[1]/div[7]/div/div[3]/section[1]/div/div[2]/div/div[1]/div[1]/span[2]/text()'))
    
    sub_cat_1 = str(tree.xpath('//*[@id="content"]/div/div[3]/ul/li[3]/a/text()')[0])
    sub_cat_2 = str(tree.xpath('//*[@id="content"]/div/div[3]/ul/li[4]/a/text()')[0])
    sub_cat_3 = str(tree.xpath('//*[@id="content"]/div/div[3]/ul/li[5]/a/text()')[0])

    row = {"Product_Name": product_name, "Brand_Name" : brand_name, "Original_Price" : price, 
           "Discounted_Price" : reduced_price ,"Rating" : rating, "Num_Reviews" : num_reviews, 
           "Sub_cat_1" : sub_cat_1, "Sub_cat_2" : sub_cat_2, "Sub_cat_3" : sub_cat_3}

    all_data.append(row)

df = pd.DataFrame(all_data)

print(df.head(5))
 

Не могли бы вы , пожалуйста, помочь мне в получении оценок и отзывов, а также, заранее спасибо.

Столбцы Оценки и количество отзывов пусты

Ожидаемые значения в обоих кольцах :

ожидаемые значения в рейтинге и num_reviews

Комментарии:

1. ваш рейтинг xpath не работает ни для одной из этих ссылок. Для этих ссылок, пожалуйста, укажите, какое значение следует извлечь.

2. @QHarr Я добавил изображение , чтобы указать значение на странице , спасибо, очень ценю вашу помощь.

3. @QHarr Возможно, вам придется немного прокрутиться вниз, чтобы увидеть раздел «Рейтинги».

4. @QHarr Ссылка, которую я использовал на скриншоте : en-ae.namshi.com/…

Ответ №1:

Эти оценки поступают из динамического запроса на другую конечную точку на основе текущего артикула. Это покажет вам, как получить данные.

Этот:

 if 'message' in review_info:
 

Проверяет, действительно ли существуют рейтинги.

Я использую Session для повышения эффективности повторного использования tcp с несколькими запросами.

 import pandas as pd 
import requests
from bs4 import BeautifulSoup
import re
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}

list_urls = [
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-little-angel-light-w1030269a.html',
'https://en-ae.namshi.com/buy-american-eagle-straight-dark-wash-jeans-w925887a.html',
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-rose-bud-teething-ring-w1030273a.html',
'https://en-ae.namshi.com/brands/buy-a-little-lovely-company-cloud-projector-light-w869154a.html',
]

all_data = []

with requests.Session() as s:
    s.headers = headers
    for lnk in list_urls:
        f = s.get(lnk).text
        sku = re.search(r'"sku":"(.*?)"', f).group(1)
        review_info = s.get(f'https://en-ae.namshi.com/_svc/reviews/{sku}').json()
        print(lnk)
        if 'message' in review_info:
            print('No averageRating')
            print('No totalAvailableRatings')
        else:
            print(review_info['averageRating'])
            print(review_info['totalAvailableRatings'])
        hun = BeautifulSoup(f,'html.parser')
 
 

Комментарии:

1. не могли бы вы помочь, пожалуйста, столбцы все еще пусты, когда я запускаю его. Большое спасибо, чувак. Я отредактировал вопрос и код.

2. Я добавил код в отредактированный раздел , я назначил переменные печати переменным, которые должны были быть записаны во фрейм данных.

3. извините , что я обнаружил свою ошибку , я не удалил старые переменные, глупый я!

4. Не беспокойтесь. Это часто случается, особенно при использовании Jupyter.