Scrapy,只接收来自无序列表的文本,包括其他html标记之间的文本

时间:2014-07-09 12:05:37

标签: python python-2.7 xpath scrapy

使用scrapy我正试图获得UL列表的项目。只有文字,而不是HTML代码。但我不能完成它。我只想将每个li标签之间的完整文本作为一个字符串(包括标签之间的文本和li标签内的文本)。 这是HTML代码的示例:

<ul>
  <li>Stoere HUMMER of Cadillic opbergtas (rood)</li>
  <li>EHBO First Aid Rapid Response kit</li>
  <li>LifeHammer met houder</li>
  <li>Aluminium <b>Midi</b> Zaklamp<br/> met alarm inclusief 3x AAA batterij</li>
  <li>Werkhandschoenen</li>
  <li>IJskrabber</li>
  <li>Afbreekmes</li>
  <li>2x veiligheidshesje</li>
  <li>Verbandschaar</li>
  <li>Reddingsdeken</li>
  <li>Verband + pleister <span>9 x rol verband</span> diverse afmetingen Pleisters</li>
  <li>Handschoenen</li>
  <li>3 x steriele gaasjes</li>
</ul>

如您所见,列表项可能包含<span><b>或其他标记。使用下面的xpath,我可以列出Python列表项中的所有项目:

sel.xpath('//*[@id="tab_description"]/ul/li[descendant-or-self::text()]').extract()

结果

['<li>Stoere HUMMER of Cadillic opbergtas (rood)</li>',
 '<li>EHBO First Aid Rapid Response kit</li>',
 '<li>LifeHammer met houder</li>',
 '<li>Aluminium <b>Midi</b> Zaklamp<br/> met alarm inclusief 3x AAA batterij</li>',
 '<li>Werkhandschoenen</li>',
 '<li>IJskrabber</li>',
 '<li>Afbreekmes</li>',
 '<li>2x veiligheidshesje</li>',
 '<li>Verbandschaar</li>',
 '<li>Reddingsdeken</li>',
 '<li>Verband + pleister <span>9 x rol verband</span> diverse afmetingen Pleisters</li>',
 '<li>Handschoenen</li>',
 '<li>3 x steriele gaasjes</li>',]

但是你可以看到它也包含所有的HTML代码。我只想收到文字。如果我试试这个:

sel.xpath('//*[@id="tab_description"]/ul/li/descendant-or-self::text()').extract()

结果将是:

['Stoere HUMMER of Cadillic opbergtas (rood)',
 'EHBO First Aid Rapid Response kit',
 'LifeHammer met houder</li>',
 'Aluminium ',
 'Midi',
 '',
 ' Zaklamp met alarm inclusief 3x AAA batterij',
 'Werkhandschoenen',
 'IJskrabber',
 'Afbreekmes',
 '2x veiligheidshesje',
 'Verbandschaar',
 'Reddingsdeken',
 'Verband + pleister ',
 '9 x rol verband',
 ' diverse afmetingen Pleisters',
 'Handschoenen',
 '3 x steriele gaasjes',]

正如您所看到的,<span><b>标记之间的结果(在li标记内)将保存为单独的列表项,这也不正确。

我只想将每个li标记之间的完整文本设置为一个字符串(包括<b>标记之间的文本以及li标记内的文本)。

这也不起作用,因为下面的xpath会跳过html代码之间的文本。 sel.xpath('//*[@id="tab_description"]/ul/li/text()').extract()

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

您至少有2个选项。

  1. 使用.//text()获取li元素中的标记内的文字并加入单个字符串
  2. 在每个string()
  3. 上使用normalize-space()函数(或li

    所以你可以做到

    [u"".join(li.xpath('.//text()').extract())
     for li in sel.xpath('//*[@id="tab_description"]/ul/li')]
    

    [li.xpath('string(.)').extract()[0]
     for li in sel.xpath('//*[@id="tab_description"]/ul/li')]
    

    两者都会给你

    [u'Stoere HUMMER of Cadillic opbergtas (rood)',
     u'EHBO First Aid Rapid Response kit',
     u'LifeHammer met houder',
     u'Aluminium Midi Zaklamp met alarm inclusief 3x AAA batterij',
     u'Werkhandschoenen',
     u'IJskrabber',
     u'Afbreekmes',
     u'2x veiligheidshesje',
     u'Verbandschaar',
     u'Reddingsdeken',
     u'Verband + pleister 9 x rol verband diverse afmetingen Pleisters',
     u'Handschoenen',
     u'3 x steriele gaasjes']