Невозможно получить текст из родительских и дочерних узлов / тегов с помощью Scrapy - PullRequest
0 голосов
/ 13 ноября 2018

, прежде чем это будет помечено как дубликат, я искал и пробовал другие решения, найденные на SO, а именно:

  1. Селектор css: получить текст всех внутренних тегов
  2. Как получить текст из дочерних узлов, если он является родителем другого узла в Scrapy, используя XPath
  3. Scrap получить весь текст, включая детей

HTML-код, из которого я хочу извлечь:

<span class="location">
    Mandarin Oriental Hotel
    <a class="" href="/search-results/Jalan+Pinang%252C+Kuala+Lumpur+City+Centre%252C+50088+Kuala+Lumpur%252C+Wilayah+Persekutuan./?state=Kuala+Lumpur" itemprop="addressRegion" title="Jalan Pinang, Kuala Lumpur City Centre, 50088 Kuala Lumpur, Wilayah Persekutuan.">
    Jalan Pinang, Kuala Lumpur City Centre, 50088 Kuala Lumpur, Wilayah Persekutuan.
    </a>
    ,
    <a class="" href="/search-results/?neighbourhood=Kuala+Lumpur&state=Kuala+Lumpur" title="Kuala Lumpur">
    Kuala Lumpur
    </a>
    ,
    <a class="" href="/search-results/?state=Kuala+Lumpur" title="Kuala Lumpur">
    Kuala Lumpur
    </a>
    <span class="" itemprop="postalCode">
        50088
    </span>
</span>

Я хочу получить весь текст в // span [@ class = 'location'].

Я пробовал:

  1. response.xpath("//span[@class='location']//text()").extract_first()
  2. response.css("span.location *::text").extract_first()
  3. response.css("span.location ::text").extract_first()

Все они возвращают только Mandarin Oriental Hotel, а не полный адрес.

EDIT: Текст должен дать

Mandarin Oriental Hotel Jalan Pinang, Центр города Куала-Лумпур, 50088 Куала-Лумпур, Wilayah Persekutuan., Куала-Лумпур, Куала-Лумпур 50088

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Попробуйте использовать приведенный ниже код, чтобы получить строковое представление каждого span с адресом:

for entry in response.xpath("//div[@class='entry']"):
    print(entry.xpath("normalize-space(./span[@class='location'])").extract_first())
0 голосов
/ 13 ноября 2018

С response.css("span.location ::text").extract_first() вы получаете только первый текст, поэтому вы можете попытаться вызвать response.css("span.location ::text").extract() и затем объединить его.

Также вы можете попробовать получить весь родительский элемент и удалить из него теги:

from w3lib.html import remove_tags

data = response.css('span.location').get()
if not data:
    return
result = remove_tags(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...