Scrapy,如何从 <b> 中提取 s 潜台词
Scrapy, how to extract s subtext from <b>
我有一个 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()
它returns:
[u'ITEM', u'ITEM2']
但我无法提取 ITEMS 的文本,我试过:
item = sectionA.xpath('.//div/@class[contains(.,"ITEM")]/text()').extract()
但是 returns 一个空列表。
我也无法提取 IDENTIFICATIONS,其中一个问题是它们可能没有任何内容或多个内容,因此我尝试从 SECTIONA 选择器中提取其中的一个选择器,如下所示:
identifications = sectionA.xpath('.//div/@id[contains(.,"IDENTIFICATION")]')
它返回一个类似于 sectionA 的选择器,但是当我尝试在其中搜索时,我一无所获:
for id in identifications:
title= signature.xpath('.//div')
我尝试了多种组合,例如 .//div/b
或 .//b
或只是 .//
,但我一无所获。
有人知道我如何从这样的 html 中获取 ITEM-TEXT 和 IDENTIFICATIONS-CONTENT 吗?
您遇到的问题不在应用的步骤中,而是一个逻辑错误。你没有在 'ITEM' class 中得到 Text 的原因是额外的 /
你正在使用。
在您编写的代码中:
item = sectionA.xpath('.//div/@class[contains(.,"ITEM")]').extract()
这里是 returns [u'ITEM', u'ITEM2']
因为在 //div/@class
中 @class 之前使用了 /
,这基本上意味着: return 我在 class 中使用的值包含 "ITEM" 子字符串。由于这里指向属性 @class
,因此 returns []
因为没有要指向的文本。
你想做的是:
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">'>]
在"IDENTIFICATIONS"的提取中出现了类似的错误,还有一个更严重的逻辑问题。在 title = signature.xpath('.//div')
中使用 //
不是合适的方法,因为它不会仅在 div IDENTIFICATIONS 中显示 div
,而是会尝试使用 all divs
预设在HTML。同样,这可能不是问题,除非在我们正在搜索的 div 之外有一个带有子字符串 "IDENTIFICATION" 的 div。所以更好的方法是做类似的事情按照要求如下:
>>> identification=sectionA.xpath('.//div[contains(@id,"IDENTIFICATION")]')
>>> for id in identification:
... print(id.xpath('div/b')).extract()
我有一个 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()
它returns:
[u'ITEM', u'ITEM2']
但我无法提取 ITEMS 的文本,我试过:
item = sectionA.xpath('.//div/@class[contains(.,"ITEM")]/text()').extract()
但是 returns 一个空列表。
我也无法提取 IDENTIFICATIONS,其中一个问题是它们可能没有任何内容或多个内容,因此我尝试从 SECTIONA 选择器中提取其中的一个选择器,如下所示:
identifications = sectionA.xpath('.//div/@id[contains(.,"IDENTIFICATION")]')
它返回一个类似于 sectionA 的选择器,但是当我尝试在其中搜索时,我一无所获:
for id in identifications:
title= signature.xpath('.//div')
我尝试了多种组合,例如 .//div/b
或 .//b
或只是 .//
,但我一无所获。
有人知道我如何从这样的 html 中获取 ITEM-TEXT 和 IDENTIFICATIONS-CONTENT 吗?
您遇到的问题不在应用的步骤中,而是一个逻辑错误。你没有在 'ITEM' class 中得到 Text 的原因是额外的 /
你正在使用。
在您编写的代码中:
item = sectionA.xpath('.//div/@class[contains(.,"ITEM")]').extract()
这里是 returns [u'ITEM', u'ITEM2']
因为在 //div/@class
中 @class 之前使用了 /
,这基本上意味着: return 我在 class 中使用的值包含 "ITEM" 子字符串。由于这里指向属性 @class
,因此 returns []
因为没有要指向的文本。
你想做的是:
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">'>]
在"IDENTIFICATIONS"的提取中出现了类似的错误,还有一个更严重的逻辑问题。在 title = signature.xpath('.//div')
中使用 //
不是合适的方法,因为它不会仅在 div IDENTIFICATIONS 中显示 div
,而是会尝试使用 all divs
预设在HTML。同样,这可能不是问题,除非在我们正在搜索的 div 之外有一个带有子字符串 "IDENTIFICATION" 的 div。所以更好的方法是做类似的事情按照要求如下:
>>> identification=sectionA.xpath('.//div[contains(@id,"IDENTIFICATION")]')
>>> for id in identification:
... print(id.xpath('div/b')).extract()