xpath: как я могу получить, если категория Type, тогда получить Villa - PullRequest
0 голосов
/ 03 мая 2020

Получить тип дома, который является виллой:

<div class="property__feature">
    <h3 class="property__feature-title property__feature-title--b-spacing">Property Details</h3>
    <ul class="property__details-list">
        <li class="property__details-item">

Вот где мне нужно получить информацию:

<span class="property__details-item--cat">Type:</span>
Villa
// ***

1 Ответ

3 голосов
/ 04 мая 2020

Они используют рендеринг шаблонов на стороне клиента, поэтому не существует селектора xpath, который можно использовать для извлечения этого элемента с помощью Scrapy, поскольку Scrapy работает только с HTML, а не с JavaScript

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

def parse(self, response):
  import json
  model_json = ''.join(response.xpath(
     './/script[@type="text/javascript" and contains(text(), "var model")]/text()'
     ).re(r'var model = (\{.+\});'))
  model_data = json.loads(model_json)
  property_data = model_data['Property']
  """
{
  "Property": {
    "Id": 80765,
    "Type": 32,
    "Status": 1,
    "Area": {
      "Id": 32,
      "Name": "Geri",
      "District": {
        "Id": 1,
        "Name": "Nicosia"
      }
    },
    "IsForRent": false,
    "RentPrice": 0,
    "IsForSale": true,
    "SalePrice": 125000,
    "PriceIsPublic": true,
    "SaleVAT": 0,
    "SaleVATType": 1,
    "Description": "<p class=\"MsoNormal\" style=\"text-align: justify;\"><span style=\"mso-fareast-language: EN-GB;\">We are pleased to present the new project of under division residential plots in one of the most sought after areas of Geri. It is located in a quiet residential area, 3 km away from the General Hospital of Nicosia, 3.5 km from the Mall of Cyprus, 2.5 km from the University of Cyprus and with easy access to the motorway. The under division plot has an area of 565 sqm and it falls into residential planning zone &Kappa;&alpha;8 with 60% building density, 35% coverage, 2 floors and a maximum height of 10m.</span></p>\r\n<p class=\"MsoNormal\" style=\"text-align: justify;\">Subject to VAT.</p>",
    "EnergyEfficiencyRating": {
      "Type": 1,
      "CurrentRating": 0,
      "PotentialRating": 0,
      "Key": null
    },
    "EnvironmentalImpactRating": {
      "Type": 2,
      "CurrentRating": 0,
      "PotentialRating": 0,
      "Key": null
    },
    "ShowOnMap": true,
    "Coordinates": {
      "Latitude": 35.119343,
      "Longitude": 33.407802
    },

Если вы хотите преобразовать эти "Type": 32 в "Type": "Building Plot", вам придется go дополнительный шаг извлечения их .init данных из другого script текста

json.loads(''.join(response.xpath(
    './/script[@type="text/javascript" and contains(text(), ".init(")]/text()'
    ).re(r'\.init\((\{.+\})\)')))
"""{
  "Resources": {
    "PropertyTypes": {
      "1": "Apartment",
      "2": "House",
      "8": "Commercial",
      "32": "Building Plot",
      "64": "Land",
      "128": "Industrial",
      "256": "Investments",
      "512": "Villa",
      "1024": "Mansion"
    },
    "PropertyStatuses": {
      "1": "Resale",
      "2": "Rented",
      "3": "Sold",

В будущем, если вы не увидите информацию, которую вы ищете, когда вы используете «Просмотр источника» вашего браузера (или в выводе response.body_as_unicode() изнутри Scrapy), затем он загружается динамически и, следовательно, нуждается в особой обработке. В большинстве случаев времени эта информация загружается через XHR , и вы на самом деле в удаче , потому что воспроизведение этого в Scrapy обычно безболезненно и выводит вас из HTML Соскоб игры полностью. Это одна из тех неудачных ситуаций, когда данные загружаются динамически, но с в пределах страницы, и, следовательно, требуется предшествующая глупость.

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