【问题标题】:How to export the text of <em> tags in sequence in scrapy如何在scrapy中按顺序导出<em>标签的文本
【发布时间】:2018-08-10 08:24:48
【问题描述】:

我正在使用scrapy解析HTML文件,内容如下:

<p class="title">
    <a href="#">#Who#</a>
    I don't <em>know</em>
    who you are
</p>

我想提取顺序中'p'标签中不包含'a'标签的所有文本。所以我期望的结果是:

["I don't ", 'know', 'who you are']

我尝试使用以下代码:

>>>selector = Selector(text="<p class='title'><a href='#'>#Who#</a>I don't <em>know</em>who you are</p>")
>>>p_txt =selector.xpath('//p[@class="title"]/text()').extract()
["I don't ", 'who you are']

结果,'em'标签中的文字被忽略了。我也尝试使用以下代码:

>>>p_txt =selector.xpath('//p[@class="title"]/descendant::text()').extract()
['#Who#', "I don't ", 'know', 'who you are']

但它也会导出'a'标签中的文本。有没有人有好的解决方案?

谢谢

【问题讨论】:

    标签: python-3.x xpath web-scraping scrapy


    【解决方案1】:

    尝试在 XPath 下获取 p 的所有后代文本节点不包括来自 a 的文本节点:

    //p[@class="title"]//text()[not(parent::a)]
    

    附:如果链接看起来像&lt;a href="#"&gt;something &lt;b&gt;bold&lt;/b&gt; inside&lt;/a&gt;,您可能需要将(parent::a) 替换为(ancestor::a)

    【讨论】:

    • 感谢您的帮助。我想问一下normalize-space()中的[not(parent::a)]怎么用,因为我的回报是["\n\t\t I don't ", 'know', 'who you are']
    • 试试p_txt = [node.strip() for node in selector.xpath('//p[@class="title"]//text()[not(parent::a)]').extract()]
    • 太棒了!非常感谢。
    猜你喜欢
    • 2016-01-10
    • 2023-03-05
    • 2020-11-25
    • 2017-09-24
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多