xpath:如何在项目A和项目B之间选择项目

时间:2015-06-11 07:50:20

标签: xpath scrapy

我有一个包含这种结构的HTML页面:

<big><b>Staff in:</b></big>
<br>
<a href='...'>Movie 1</a>
<br>
<a href='...'>Movie 2</a>
<br>
<a href='...'>Movie 3</a>
<br>
<br>
<big><b>Cast in:</b></big>
<br>
<a href='...'>Movie 4</a>

如何使用Xpath选择电影1,2和3? 我写了这个查询

'//big/b[text()="Staff in:"]/following::a'

但它会返回电影1,2,3和4.我想我需要找到一种方法来获取<big><b>Staff in:之后但下一个<big>之前的项目。

谢谢,

3 个答案:

答案 0 :(得分:2)

假设<big><b>Staff in:</b></big>是我们可以用作&#39;锚点的唯一元素,您可以尝试这种方式:

//big[b='Staff in:']/following-sibling::a[preceding-sibling::big[1][b='Staff in:']]

基本上,xpath会找到跟随&#39;锚点的兄弟姐妹的所有<a>。上面提到的<big>元素,并将结果限制为具有最接近的前一个兄弟<big>的那些等于锚元素。

输出xpath tester给出标记作为输入(进行最小调整以使其格式良好的XML):

Element='<a href="...">Movie 1</a>'
Element='<a href="...">Movie 2</a>'
Element='<a href="...">Movie 3</a>'

答案 1 :(得分:0)

//a[preceding::b[text()="Staff in:"] and following::b[text()="Cast in:"]]

返回元素a之后的所有b,文本Staff in:但在元素b之前,文本为Cast in:

您可能需要添加更多条件,以使其更具体,具体取决于这些b元素在页面上是否唯一。

答案 2 :(得分:0)

在这里添加并关注stackoverflow链接XPath axis, get all following nodes until这里是我使用xslt编辑器完成的完整解决方案。首先使用/ * /而不是//因为这更快。其次逻辑说,如果满足大节点之前的兄弟节点等于他们所遵循的内部条件,则返回所有作为大兄弟的锚节点。还假设你有不同的大节点。

x-path看起来像

/*/big[b="Cast in:"]/following-sibling::a [1 = count(preceding-sibling::big[1]| ../big[b="Cast in:"])]

xslt解决方案看起来像

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
            <h2>My Movie Collection</h2>
            <table border="1">
                <tr bgcolor="#9acd32">
                    <th>Title</th>

                </tr>
                <xsl:variable name="placeholder" select="/*/big" />
                <xsl:for-each select="$placeholder">
                    <xsl:variable name="i" select="position()" />
                    <b>
                        <xsl:value-of select="$i" />
                        <xsl:value-of select="$placeholder[$i]" />
                    </b>
                    <xsl:for-each
                        select="following-sibling::a [1 = count(preceding- 
sibling::big[1]| ../big[b=$placeholder[$i]])]">
                        <tr>
                            <td>
                                <xsl:value-of select="." />
                            </td>

                        </tr>
                    </xsl:for-each>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>