XPATH Selector не может выделить блок HTML-кода - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь извлечь некоторые данные из alibaba.com.Для этого я использую скрап.Хотя он работал для большинства частей, селектор, похоже, не захватывает блок кода из профиля компании.Кто-нибудь может мне помочь с этой проблемой?

# -*- coding: utf-8 -*-
import scrapy
import csv
import os
import numpy as np

class AlibabaCrawlerSpider(scrapy.Spider):
    name = 'alibaba_crawler'
    allowed_domains = ['alibaba.com']
    start_urls = ['http://alibaba.com/']
    delimiter = '|'

    def start_requests(self):
        """Read keywords from keywords file amd construct the search URL"""

        with open(os.path.join(os.path.dirname(__file__), "../resources/keywords.csv")) as search_keywords:
            for keyword in csv.DictReader(search_keywords):
                search_text=keyword["keyword"]
                url="https://www.alibaba.com/trade/search?fsb=y&IndexArea=product_en&CatId=&SearchText={0}&viewtype=G".format(
                    search_text)
                # The meta is used to send our search text into the parser as metadata
                yield scrapy.Request(url, callback = self.parse, meta = {"search_text": search_text})


    def parse(self, response):
        """Function to process alibaba search results page"""
        search_keyword=response.meta["search_text"]
        products=response.xpath("//div[@class='item-main']")

        # Defining the XPaths

        XPATH_PRODUCT_LINK=".//div[@class='item-info']//h2/a/@href"

        # iterating over search results
        for product in products:

            raw_product_link=product.xpath(XPATH_PRODUCT_LINK).extract()

            print(raw_product_link)

            product_link="https:" + raw_product_link[0] if raw_product_link else None

            yield scrapy.Request(product_link, callback=self.parse_product)

            break

    def parse_product(self, response):

        product=response.xpath("//div[@class='content-body']")

        # Defining the XPaths

        XPATH_COMPANY_FIELD=".//div[@class='tab-body']//div[contains(@class,'ls-company')]"#//div[@class='alisite']"#td[@class='field-title']/text()"

        raw_company_field=product.xpath(XPATH_COMPANY_FIELD) #.extract()

        print(raw_company_field)

Я пытаюсь напечатать raw_company_field.Это работает до этого момента.Но это дает пустой список, когда я иду на уровни ниже, например, alisite и далее. введите описание изображения здесь

1 Ответ

0 голосов
/ 25 мая 2019

XPath не проверяет классы таким образом.

Селектор типа //div[@class='tab-body'] будет соответствовать только с tab-body в качестве единственного класса.Чтобы выбрать элементы, которые имеют класс среди других, вы делаете что-то вроде этого:

//div[contains(concat(' ',normalize-space(@class),' '),' tab-body ')]

или вместо этого используете селекторы css:

div.tag-body
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...