在 Scrapy 中连接 Xpath 嵌套文本

Posted

技术标签:

【中文标题】在 Scrapy 中连接 Xpath 嵌套文本【英文标题】:Concatenating Xpath nested text in Scrapy 【发布时间】:2015-10-09 01:01:19 【问题描述】:

我一直在尝试将一些嵌套文本与 Scrapy 中的 xpath 连接在一起。我认为它使用 xpath 1.0?我看过很多其他帖子,但似乎没有什么能得到我想要的

这里是html的具体部分(实际页面http://adventuretime.wikia.com/wiki/List_of_episodes):

<tr>
<td colspan="5" style="border-bottom: #BCD9E3 3px solid">
    Finn and Princess Bubblegum must protect the <a href="/wiki/Candy_Kingdom" title="Candy Kingdom">Candy Kingdom</a> from a horde of candy zombies they accidentally created.
</td>
</tr>

<tr>
<td colspan="5" style="border-bottom: #BCD9E3 3px solid">
Finn must travel to <a href="/wiki/Lumpy_Space" title="Lumpy Space">Lumpy Space</a> to find a cure that will save Jake, who was accidentally bitten by <a href="/wiki/Lumpy_Space_Princess" title="Lumpy Space Princess">Lumpy Space Princess</a> at Princess Bubblegum's annual 'Mallow Tea Ceremony.'
</td>
</tr>

(much more stuff here)

这是我想要返回的结果:

[u'Finn and Princess Bubblegum must protect the Candy Kingdom from a horde of candy zombies they accidentally
    created.\n', u'Finn must travel to Lumpy Space to find a cure that will save Jake, who was accidentally bitten', (more stuff here)]

我尝试使用来自 HTML XPath: Extracting text mixed in with multiple tags?

description =sel.xpath("//table[@class='wikitable']/tr[position()>1]/td[@colspan='5']/parent::tr/td[descendant-or-self::text()]").extract()

但这只会让我回来

[u'<td colspan="5" style="border-bottom: #BCD9E3 3px solid">Finn and Princess Bubblegum must protect the <a href="/wiki/
Candy_Kingdom" title="Candy Kingdom">Candy Kingdom</a> from a horde of candy zombies they accidentally created.\n</td>',

string() 的答案似乎对我也不起作用...我得到一个只有一个条目的列表,而且应该还有更多。

我得到的最接近的是:

description = sel.xpath("//table[@class='wikitable']/tr[position()>1]/td[@colspan='5']//text()").extract()

这让我回来了

[u'Finn and Princess Bubblegum must protect the ', u'Candy Kingdom', u' from a horde of candy zombies they accidentally
created.\n', u'Finn must travel to ', u'Lumpy Space', u' to find a cure that will save Jake, who was accidentally bitten, (more stuff here)]

有人知道关于连接的 xpath 技巧吗?

谢谢!!

编辑:蜘蛛代码

class AT_Episode_Detail_Spider_2(Spider):

    name = "ep_detail_2"
    allowed_domains = ["adventuretime.wikia.com"]
    start_urls = [
        "http://adventuretime.wikia.com/wiki/List_of_episodes"
    ]

    def parse(self, response):
        sel = Selector(response)

        description = sel.xpath("//table[@class='wikitable']/tr[position()>1]/td[@colspan='5']//text()").extract()
        print description

【问题讨论】:

【参考方案1】:

通过join()手动连接:

description = " ".join(sel.xpath("//table[@class='wikitable']/tr[position()>1]/td[@colspan='5']//text()").extract())

或者将Join() 处理器与Item Loader 结合使用。


这是获取剧集描述列表的示例代码:

def parse(self, response):
    description = [" ".join(row.xpath(".//text()[not(ancestor::sup)]").extract())
                   for row in response.xpath("//table[@class='wikitable']/tr[position()>1]/td[@colspan]")]
    print description

【讨论】:

join() 并不是我想要的。我应该更具体一点。请注意,在我想要取回的数据中,不止一个字符串。我只想将文本与其他 a 标签组合在一起,而不是将所有文本和 a 标签组合在一起。我会很快更新我的 html... @pyramidface 你可以并且可能仍然应该使用join() 解决它。除了您可能需要遍历行以制作描述列表之外。您还可以发布您拥有的完整蜘蛛代码,以便我可以更多地了解上下文吗?谢谢! @pyramidface 好的,我已经更新了答案,包括获取描述列表的代码。这是你问的吗?谢谢。 啊这太棒了!谢谢......但这给我带来了一些问题......你能告诉我你如何/为什么使用response而不是sel吗?我尝试在.//text() 中打印出没有. 的一行。这太疯狂了,哈哈。 . 有什么作用? 另外...我注意到 sup 中的文本(与标签相同的级别),如 [226],也被合并到最终输出中。我怎么能忽略你写的代码呢?我有一个解决方案,但不是通过 xpath。也许只是做一些 python 解析来删除任何带方括号的东西。

以上是关于在 Scrapy 中连接 Xpath 嵌套文本的主要内容,如果未能解决你的问题,请参考以下文章

Xpath开始在Scrapy上重新调整无

Xpath - 包含文本值的表的多个嵌套div

在 Scrapy 中嵌套项目数据

在 Scrapy 中使用 Xpath 选择段落下方的任何文本

使用 Pig 在 XPath 中进行嵌套解析

如何在具有 xmlns 属性的 xml 中使用 xpath 获取特定的嵌套元素? [复制]