X路径选择器,用于对具有相同标签的兄弟节点进行分组

时间:2019-06-15 21:29:15

标签: python xpath

我正在尝试使用scrapy构建网络爬虫,该爬虫将数据存储在字典中,其中的键是header( h1 )标记内的文本,而值是标头标签后面的 p 标签。

请考虑以下HTML代码。

ui.Image

如何将h1之间的所有p标签分组并使用XPath选择器(版本1 )作为列表返回。

例如:[“一些需要分组的文本。”,
“另外一些文本需要分组。”
“同样在这里。” ]

OR

是否有更好的逻辑来解决问题?

任何帮助表示赞赏! 预先谢谢你

1 个答案:

答案 0 :(得分:0)

单独使用XPath-1.0是不可能的。但是您可以使用XSLT方法(适用XPath-1.0函数)。这确实可以根据需要对输出进行分组。因此,将此XSLT-1.0样式表应用于您的XML数据:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:key name="head" match="*[not(self::h1)]" use="generate-id(preceding-sibling::h1[1])" />

    <xsl:template match="/root">
        <xsl:for-each select="h1">
            <group>
                <xsl:for-each select="key('head', generate-id())">
                    <xsl:value-of select="." />
                </xsl:for-each>
            </group>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

其输出为:

<?xml version="1.0" encoding="UTF-8"?>
<group> Some text  that  need to be grouped </group>
<group> Another  few texts  that  need to be  grouped. </group>
<group> Same  here. </group>

现在,您可以将此XML数据导入Python(可能有必要将这些数据包装到根元素中,以使其对XML解析器而言是可口的)。但是现在您可以将每个组提取为名为<group>的元素的字符串值。

PS:
如果要去除不必要的空格,请将xsl:value-of更改为

<xsl:text> </xsl:text><xsl:value-of select="normalize-space(.)" />