我正在尝试使用scrapy构建网络爬虫,该爬虫将数据存储在字典中,其中的键是header( h1 )标记内的文本,而值是标头标签后面的 p 标签。
请考虑以下HTML代码。
ui.Image
如何将h1之间的所有p标签分组并使用XPath选择器(版本1 )作为列表返回。
例如:[“一些需要分组的文本。”,
“另外一些文本需要分组。”
“同样在这里。”
]
OR
是否有更好的逻辑来解决问题?
任何帮助表示赞赏! 预先谢谢你
答案 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(.)" />