我有一个像这样的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?
答案 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