【问题标题】:Select text of element containing a div with specific class选择包含具有特定类的 div 的元素的文本
【发布时间】:2020-04-08 14:27:27
【问题描述】:

我正在使用 scrapy css 选择器提取以下 html 并将其加载到项目加载器。

如何提取td 的文本,其中td 包含一个divsweetness

即我要提取文字Dry

HTML 代码:

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

在scrapy ItemLoader中,我定义了一个字段sweetness,但是我不确定这个css选择查询是什么。

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()

【问题讨论】:

    标签: html css scrapy


    【解决方案1】:

    见下文-

    loader = ItemLoader(item=wine_item, response=response)
    loader.add_xpath('div_content', '//td/div[@class="sweetness"]')
    loader.load_item()
    

    【讨论】:

      【解决方案2】:

      我在这个问题上苦苦挣扎了很久,发现css不支持选择父节点parent selector in css

      幸运的是,xpath 选择器比 css 选择器强大得多! scrapy 中的 lxml 包支持它,其中 xpath 实际上是第一类,是 css 的超集,而 css 只是它的扩展(实际上是一个单独的包和所有css selectors are translated to xpath)。

      所以回到您的问题,只需使用父路径从您的 div.sweetness 转到父节点 td

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

      或简写

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

      应该这样做!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 2015-10-16
        • 2017-05-21
        • 2012-05-18
        • 2017-01-13
        • 2015-10-10
        • 2023-03-18
        相关资源
        最近更新 更多