Xpath,从div内部选择文本,同时也采用普通文本

时间:2017-10-03 05:15:24

标签: python html xpath scrapy

基本上我有类似的HTML:

<div>
    <p>
        <b>1</b> Communication
    </p>
    <p>
        <b>2</b> Errors
    </p>
    ...
</div>

我尝试(使用Scrapy)是这样的:

response.xpath("//div//p//text()")

然而,这会返回一个列表,例如

[
    "1",
    "Communication",
    "2",
    "Errors"    
]

我希望有类似的东西:

[
    "1 Communication",
    "2 Errors"
]

这里的任何帮助将不胜感激。我试图想办法忽略b标签,但我找不到任何实际工作的东西。我不能仅仅加入列表索引的原因是因为不是每个需要解析的html都是这样的。我想使用可以忽略b标签的东西,如果它们存在,而在任何情况下只是在p中获取文本。谢谢!

1 个答案:

答案 0 :(得分:1)

如果您的常规模式是忽略<b>标记,则可以使用w3lib删除这些标记并从结果中构建新的响应。类似的东西:

import w3lib
import scrapy

new_body = w3lib.html.remove_tags(response.body, which_ones=('b'))
new_response = scrapy.http.HtmlResponse(url=response.url, body=new_body)

new_response现在包含原始回复,但删除了<b>个标记。然后,您可以使用提取逻辑而无需考虑它们。