Scrapy,如何从<b>中提取s子文本

时间:2017-06-14 13:33:40

标签: html css xpath scrapy scrapy-spider

我有一个像这样的HTML:

<section id="SECTION_A">
    <h4>List</h4>

            <a style="text-decoration: none;" href="#list" data-toggle="collapse">
                <div class="ITEM">            
                    TEXT
                </div>
            </a>

            <div id="IDENTIFICATION" class="collapse">

            </div>

            <a style="text-decoration: none;" href="#list" data-toggle="collapse">

                <div class="ITEM2">
                    TEXT2
                </div>
            </a>
            <div id="IDENTIFICATION2" class="collapse">

                        <div><b>TITLE</b>: CONTENT</div>

                        <div><b>TITLE2</b>: CONTENT2</div>         
            </div>   
</section>

我已将它存储在这样的选择器XPATH中,因为html有几个具有相似结构,标签和重复数据的部分:

sectionA = response.xpath('//section[@id="SECTION_A"]')

现在,我想提取ITEMS及其IDENTIFICATIONS并将它们写入文件。

提取ITEM没有问题:

item = sectionA.xpath('.//div/@class[contains(.,"ITEM")]').extract()

它返回:

[u'ITEM', u'ITEM2']

但是我无法提取ITEMS的TEXT,我试过了:

item = sectionA.xpath('.//div/@class[contains(.,"ITEM")]/text()').extract()

但是返回一个空列表。

我也无法提取IDENTIFICATIONS,其中一个问题是它们可能没有任何内容或几个,所以我试图从SECTIONA选择器中提取它们的选择器,如下所示:

identifications = sectionA.xpath('.//div/@id[contains(.,"IDENTIFICATION")]')

它重新调整了一个类似于sectionA的选择器,但是当我尝试搜索它时,我对此一无所知:

for id in identifications:
    title= signature.xpath('.//div')

我尝试了.//div/b.//b.//之类的sevelal组合,但我什么都没有。

任何人都知道如何从像这样的HTML获取ITEM-TEXT和IDENTIFICATIONS-CONTENT?

1 个答案:

答案 0 :(得分:1)

您遇到的问题不在于应用的步骤,而是逻辑错误。您没有在&#39; ITEM&#39;中找到文字的原因class 是由于你正在使用的额外/

在您编写的代码中:

  

item = sectionA.xpath('.//div/@class[contains(.,"ITEM")]').extract()

由于在[u'ITEM', u'ITEM2']中的@class之前使用/,它返回//div/@class,这基本上就是这样:返回包含&的类中使用的值#34; ITEM&#34; 子串。由于此处指向了属性@class,因此没有要指向的文本,它会返回[]

您反而想做的是:

item = sectionA.xpath('.//div[contains(@class,"ITEM")]/text()').extract()

此处sectionA.xpath('.//div[contains(@class,"ITEM")]')的输出是选择器:

[<Selector xpath='.//div[contains(@class,"ITEM")]' data=u'<div class="ITEM">'>, <Selector xpath='.//div[contains(@class,"ITEM")]' data=u'<div class="ITEM2">'>]

在提取“识别”和#34;时出现了类似的错误,还有一个更严重的逻辑问题。在//title = signature.xpath('.//div')的使用情况不是合适的方法,因为它不会在div IDENTIFICATIONS中显示div,而是尝试使用所有 { {1}}预设在HTML中。同样,这可能不是问题,除非有一个带子字符串的div&#34; IDENTIFICATION&#34;在我们搜索的div之外。所以更好的方法就是按照要求做一些类似的事情:

divs