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

jtjikinw  于 8个月前  发布在  Python
关注(0)|答案(3)|浏览(86)

我希望你过得很好。

<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代码块,我想从li接收文本。但不幸的是,这个li没有我可以选择的类或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:')]

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

brqmpdu1

brqmpdu11#

使用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'
doinxwow

doinxwow2#

检查以下示例并尝试:

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

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

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

f45qwnt83#

对于这种情况,我严格反对任何形式的...按照其他答案中的建议,在查询中硬编码字段名称。

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标签。并在li中分别捕获字段名称和它的文本。通过这种方法,您将能够捕获所有字段名称/值。
print(item)的输出:

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

相关问题