Невозможно захватить следующего брата с помощью селектора css в scrapy - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь получить бюджет, используя scrapy, реализующий в нем селектор css. Я могу получить его, когда использую xpath, но в случае селектора css я потерялся. Я даже могу получить контент, когда я go для BeautifulSoup и использую next_sibling.

Я пробовал с:

import requests
from scrapy import Selector

url = "https://www.imdb.com/title/tt0111161/"

res = requests.get(url)
sel = Selector(res)
# budget = sel.xpath("//h4[contains(.,'Budget:')]/following::text()").get()
# print(budget)

budget = sel.css("h4:contains('Budget:')::text").get()
print(budget)

Вывод Я использую селектор css :

Budget:

Ожидаемый результат:

$25,000,000

Соответствующая часть html:

<div class="txt-block">
            <h4 class="inline">Budget:</h4>$25,000,000
            <span class="attribute">(estimated)</span>
        </div>

адрес веб-сайта

Эта часть на этом сайте отображается как: введите описание изображения здесь

Как я могу получить бюджетную информацию с помощью селектора css, когда он используется в scrapy?

1 Ответ

1 голос
/ 06 августа 2020

Этот селектор .css("h4:contains('Budget:')::text") выбирает тег h4, а текст, который вы хотите, находится в его родительском элементе div.

Вы можете использовать .css('div.txt-block::text'), но это вернет несколько элементов , так как на странице есть несколько таких элементов. Селекторы CSS не имеют родительского псевдоэлемента, я думаю, вы можете использовать .css('div.txt-block:nth-child(12)::text'), но если вы собираетесь очистить больше страниц, это, вероятно, не удастся на других страницах.

Лучшим вариантом будет использовать XPath:

response.xpath('//h4[text() = "Budget:"]/parent::div/text()').getall()
...