Выделите текст элемента, содержащего div, с указанием класса c - PullRequest
1 голос
/ 08 апреля 2020

Я использую селектор scrapy css, чтобы извлечь приведенный ниже html и загрузить его в загрузчик элементов.

Как извлечь текст td, в котором этот td содержит div с классом sweetness

т.е. я хочу извлечь текст Dry.

HTML код:

<tr>
    <td>
        <div class="grape">
        </div>
        Cabernet Sauvignon
    </td>
    <td>
        <div class="sweetness">
        </div>
        Dry
    </td>
</tr>

В scopy ItemLoader я определил поле sweetness, но я не уверен, что это за запрос css select для этого.

PYTHON код:

def parse_wine(self, response):
    wine_item = response.meta['wine_item']
    loader = ItemLoader(item=wine_item, response=response)
    ...
    loader.add_css('sweetness', '????')
    yield loader.load_item()

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

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

К счастью, селектор xpath гораздо более мощный чем css селектор! Он поддерживается пакетом l xml в scrapy, где xpath на самом деле является первым классом, и надмножеством css, тогда как css является лишь его расширением (фактически отдельным пакетом и всеми * 1024). * селекторы переведены в xpath ).

Итак, возвращаясь к вашему вопросу, просто используйте родительский путь к go от вашего div.sweetness до родительского узла td

...
loader.add_xpath('sweetness', '//div[@id="answer-13134778"]/parent::*')
...

или сокращение

....
loader.add_xpath('sweetness', '//div[@id="answer-13134778"]/..')
````

должно сделать это!

0 голосов
/ 08 апреля 2020

См. Ниже -

loader = ItemLoader(item=wine_item, response=response)
loader.add_xpath('div_content', '//td/div[@class="sweetness"]')
loader.load_item()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...