代码之家  ›  专栏  ›  技术社区  ›  Nimo Db

如何在python的scrapy选择器中只获取文本

  •  0
  • Nimo Db  · 技术社区  · 2 年前

    我希望你做得很好。

    <ul>
      <li>
        <s>Title:</s>
        De Aardappeleters
      </li>
      <li>
        <s>Dimensions:</s>
        82 x 114 cm
      </li>
      <li>
        <s>Media:</s>
        canvas
      </li>
      <li>
        <s>Style:</s>
        Realism
      </li>
      <li>
        <s>Date:</s>
        1885
      </li>              ______
      <li>                     |
        <s>Genre:</s>          | It is located on a page of the website here
        Modern                 |
      </li>              ______| 
    </ul> 
    

    我有一个HTML块,我想从中接收文本 但不幸的是 没有我可以选择的类或ID。此块用于网站。

      <li>
        <s>Genre:</s>
        Modern
      </li>
    

    我想选择流派列表并获取文本。

    Modern
    

    这里的主要问题是,这个块在另一个页面上是不同的。

    <ul>
      <li>
        <s>Title:</s>
        De Aardappeleters
      </li>
      <li>
        <s>Dimensions:</s>
        82 x 114 cm
      </li>
      <li>
        <s>Media:</s>
        canvas
      </li>              ______
      <li>                     |
        <s>Genre:</s>          |And it is located here on another page.
        Modern                 |
      </li>              ______| 
      <li>
        <s>Style:</s>
        Realism
      </li>
      <li>
        <s>Date:</s>
        1885
      </li>
    </ul>
    
    OriginalTagFind = layout.css('article ul li s::text').getall()
        
    TitleOriginal = [tag.strip() for tag in OriginalTagFind if tag.startswith('Genre:')] 
      
    

    在我看来,如果我来到我选择的地方,用下一个兄弟姐妹打印母亲名单的文本。有可能吗

    0 回复  |  直到 2 年前
        1
  •  1
  •   Alexander    2 年前

    使用css选择器,您可以使用:

    'li:has(s):contains("Genre:")::text'

    使用xpath选择器,您可以使用:

    "//li[s[contains(text(), 'Genre')]]/text()"

    我已经用下面的例子演示了如何使用这两种方法:

    In [1]: html = """<ul>
       ...:   <li>
       ...:     <s>Title:</s>
       ...:     De Aardappeleters
       ...:   </li>
       ...:   <li>
       ...:     <s>Dimensions:</s>
       ...:     82 x 114 cm
       ...:   </li>
       ...:   <li>
       ...:     <s>Media:</s>
       ...:     canvas
       ...:   </li>
       ...:   <li>
       ...:     <s>Style:</s>
       ...:     Realism
       ...:   </li>
       ...:   <li>
       ...:     <s>Date:</s>
       ...:     188
       ...:   </li>
       ...:   <li>
       ...:     <s>Genre:</s>
       ...:     Modern
       ...:   </li>
       ...: </ul> """
    
    In [2]: selector = scrapy.Selector(text=html)
    
    In [3]: ''.join(selector.xpath("//li[s[contains(text(), 'Genre')]]/text()").getall()).strip()
    Out[3]: 'Modern'
    
    In [4]: ''.join(selector.css('li:has(s):contains("Genre:")::text').getall()).strip()
    Out[4]: 'Modern'
    
        2
  •  1
  •   Raisul Islam    2 年前

    检查以下示例并尝试:

    genre = response.xpath('//li[s/text()="Genre:"]/text()').get()
    

    如果它包含额外的空格,请使用strip()删除空格,

    genre = response.xpath('//li[s/text()="Genre:"]/text()').get().strip()
    
        3
  •  1
  •   Georgiy    2 年前

    对于此类案件,我坚决反对任何形式的。。按照其他答案中的建议,在查询中硬编码字段名。

    
    from parsel import Selector
    
    html = '''
    <ul>
      <li>
        <s>Title:</s>
        De Aardappeleters
      </li>
      <li>
        <s>Dimensions:</s>
        82 x 114 cm
      </li>
      <li>
        <s>Media:</s>
        canvas
      </li>
      <li>
        <s>Style:</s>
        Realism
      </li>
      <li>
        <s>Date:</s>
        1885
      </li>              
      <li>              
        <s>Genre:</s>    
        Modern        
      </li>          
    </ul> '''
    
    response = Selector(html)
    
    item = {}
    for li in response.css('ul li'):
        item[li.css('s::text').get('')] = li.css('::text').getall()[-1].strip(' \n')
    
    print(item)
    

    在这种情况下,最好进行循环。。对于每一个 li 标签。在里面 分别捕获字段名和文本。通过这种方法,您将能够捕获所有字段名/值。

    输出来自 print(item) :

    {
        'Title:': 'De Aardappeleters',
        'Dimensions:': '82 x 114 cm',
        'Media:': 'canvas',
        'Style:': 'Realism',
        'Date:': '1885',
        'Genre:': 'Modern'
    }