Не удается выбрать определенный элемент в Xpath - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь удалить эту страницу:

https://www.coolblue.nl/en/our-assortment

Я удаляю почти все ссылки в каждом разделе категории успешно.Но по какой-то причине все эти ссылки «Больше ..» не проходят, даже если их Xpath должен быть таким же, как и другие ссылки.

То, что я искал в своем инспекторе

То, что я сейчас делаю, ищет все значения «href», принадлежащие тегам «a» со значением класса category-navigation--link

Я использую Scrapy на Python,таким образом, я получаю информацию из своего скрипта:

response.xpath("//a[@class='category-navigation--link']/@href")

Это хорошо сработало, чтобы дать большинство ссылок на странице, за исключением этих ссылок "Еще ..", но я не могупонять, почему.Кажется, они такие же, как и другие, но селектор xpath почему-то не может получить информацию ..

РЕДАКТИРОВАТЬ: Вот мой код.Он должен работать так же, как прекрасный пример супа PS1212, размещенный здесь, с той лишь разницей, что я возвращаю ссылки.По какой-то причине он пропускает все эти URL-адреса в поле href из всех этих элементов «More ..».

import scrapy
from ..items import CoolBlueItems


class QuoteSpider(scrapy.Spider):
    name = "coolblue2"

    start_urls = ["https://www.coolblue.nl/en/our-assortments]

    def __init__(self):

        self.declare_xpath()

    def declare_xpath(self):

        self.getAllSubCategoriesUrlsXpath = "//a[@class='category-navigation--link']/@href"

    def parse(self, response):

        item = CoolBlueItems()

        urls_list = []

        no_scrap_urls = ["/en/promotion", "/en/second-chance", "/en/gift-cards", "/en/coolblue-fan-products", "/en/all-brands"]

        for Urls in response.xpath(self.getAllSubCategoriesUrlsXpath).getall():

            current_url = Urls.strip()

            if current_url not in urls_list and current_url not in no_scrap_urls and current_url.count("/") == 2:
                urls_list.append(current_url)
                item["Url"] = response.urljoin(current_url)
                yield item

Я следовал совету PS1212.Пришлось внести некоторые изменения, потому что он выдавал ошибку, связанную с обработкой информации в re.Функция:

import scrapy
from ..items import CoolBlueItems


    class QuoteSpider(scrapy.Spider):
        name = "coolblue2"

        start_urls = ["https://www.coolblue.nl/en/our-assortments]

        for a in response.css("a.category-navigation--link::attr('href')").getall():
            item["Url"] = re.split('/', a)
            yield item

Он по-прежнему пропускает тот элемент, который я хочу.Вот первые записи вывода:

Category,CurrentPrice,OriginalPrice,Title,Url
,,,,",en,laptops"
,,,,",en,laptops,apple-macbook"
,,,,",en,desktops"
,,,,",en,monitors"
,,,,",en,keyboards"

РЕДАКТИРОВАТЬ: Проблема была сама селектор.Я могу заставить мой скрипт работать, но мне все еще любопытно, почему селектор CSS работает, а xpath - нет.Вот тест, который я сделал, где я использую xpath и css для удаления всех элементов из разделов "a" с определенным классом:

>>> response.xpath("//a[@class='category-navigation--link']")[4].getall()
['<a class="category-navigation--link" href="/en/keyboards" rel="nofollow">\n                    Keyboards\n                </a>']
>>>



>>> response.css('a.category-navigation--link')[4].get()
'<a class="category-navigation--link category-navigation--link--black" href="/en/laptops-desktops-monitors" data-trackclickevent="Homepage categor
y navigation|Computers &amp; tablets|More..">\n                                                                        More..\n
                                                 </a>'

Как видите, 5-й элемент массива,Индекс 4 в обоих случаях возвращает разные значения.Я, должно быть, ошибаюсь где-то в моем селекторе Xpath.

1 Ответ

1 голос
/ 12 марта 2019

Попробуйте:

import requests, re
from bs4 import Beatifulsoup

htl = requests.get('https://www.coolblue.nl/en/our-assortment')
soup = Beautifulsoup(htl.text, 'lxml')

a_tages = soup.findAll('a', class_='category-navigation--link')
for a in a_tages:
       href_list = re.split('/',a.get('href')))
       print(href_list.pop())

Через Scrapy:

import scrapy
from ..items import CoolBlueItems

class QuoteSpider(scrapy.Spider):
      name = "coolblue2"
      start_urls = ["https://www.coolblue.nl/en/our-assortments]

      def parse(self, response):
          item = CoolBlueItems()

          for a in response.css('a.category-navigation--link'):
              url = a.css("::attr('href')").extract()
              split_url = re.split('/', url))
              print(split_url.pop())

вывод :

laptops
apple-macbook
desktops
monitors
laptops-desktops-monitors
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...