我是一个Scrapy& Xpath初学者,我正在寻找一个具有以下结构的网站
<dl class="ismSummary ismHomeSummary">
<dt>cat1</dt>
<dd>value1</dd>
<dd>value2</dd>
<dt>cat2</dt>
<dd>value1</dd>
<dd>value2</dd>
</dl>
使用Xpath我只想获得value1&amp; cat1的值2(dd
)
这就是我现在所拥有的
//dt[text()="cat1"]/following-sibling::dd
问题是它不会停留在cat2并继续选择value1&amp;来自cat2的value2。 :(
答案 0 :(得分:3)
此处的所有节点都是dl
的子节点,所以当然所有节点都是第一个dt
的兄弟节点,因此当您使用following-sibling
时,您可以获得所有节点。
Xpath是用xml制作的,在xml中你可能会有dd
个元素作为dt
的子元素,但不幸的是,这不是这里的情况。
最简单的方法是只包括dt
的所有兄弟(不仅仅是dd
s)并迭代结果集直到dt
出现。使用Xpath函数可以做同样的事情,但肯定会更复杂。
答案 1 :(得分:3)
使用强>:
//dt[. = 'cat1']
/following-sibling::dd
[count(.| //dt[. = 'cat2']/preceding-sibling::dd)
=
count(//dt[. = 'cat2']/preceding-sibling::dd)
]
假设每个//dt[. = 'cat1']
和//dt[. = 'cat2']
选择一个元素,上面的表达式会精确选择所需的两个dd
元素。
基于XSLT的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"//dt[. = 'cat1']
/following-sibling::dd
[count(.| //dt[. = 'cat2']/preceding-sibling::dd)
=
count(//dt[. = 'cat2']/preceding-sibling::dd)
]
"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时(最后两个dd
的值已修改,因此我们确定已选中所需元素):
<dl class="ismSummary ismHomeSummary">
<dt>cat1</dt>
<dd>value1</dd>
<dd>value2</dd>
<dt>cat2</dt>
<dd>value3</dd>
<dd>value4</dd>
</dl>
评估XPath表达式,并将其选择的节点复制到输出中:
<dd>value1</dd>
<dd>value2</dd>
<强>解释强>:
这里我们在XPath 1.0中使用 Kayessian方法进行节点集交集:
两个节点集的交集:$ns1
和$ns2
:
$ns1[count(.|$ns2) = count($ns2)]
在我们的案例中,我们将$ns1
替换为:
//dt[. = 'cat1']/following-sibling::dd
,我们将$ns2
替换为:
//dt[. = 'cat2']/preceding-sibling::dd
答案 2 :(得分:1)
尝试:
rm -Rf MYAPP/migrations/*
python manage.py makemigrations --empty MYAPP
python manage.py makemigrations
python manage.py migrate --fake MYAPP 0002