Xpath:如何排除我想要的节点内的节点?

时间:2016-11-22 06:02:55

标签: xpath

在html树的这张图片的this picture of an html tree中,我只想要<div class="d">节点,但<table>节点及以下是我想要从{{1}中排除的节点} node。

2 个答案:

答案 0 :(得分:1)

你可以通过做这样的事情一个接一个地手动挑选它们

tablePath = "//div[@class='d']/table"
table = response.selector.xpath(tablePath ).extract(),
para_1_Path = "//div[@class='d']/p[5]"
para_1 = response.selector.xpath(para_1_Path).extract()

等等

或者你可以提取所有div class="d"数据并对其进行修剪,但这会很棘手,因为你说你是scrapy的新手。

答案 1 :(得分:0)

尝试使用Xpath count

count(preceding-sibling::table)>0

类似的东西:

>>> import lxml.html
>>> s = '''
... <div class="d">
...   <p style="text-align: center">...</p>
...   <p>...</p>
...   <h2>Daydream...</h2>
...   <p>...</p>
...   <p>...</p>
...   <p>VRsat</p>
...   <table><tbody><tr><td>...</td></tr></tbody></table>
...   <p style="text-align: center">...</p>
...   <p style="text-align: center">...</p>
...   <div id="click_div">...</div>
... </div>
... '''
>>> doc = lxml.html.fromstring(s)
>>> xpath = '//div[@class="d"]/*[self::table or count(preceding-sibling::table)>0]'
>>> for x in doc.xpath(xpath): x.tag
...
'table'
'p'
'p'
'div'

<强>更新

OP实际上是在询问我上面解决方案的逆转。

所以,添加not,切换到and,将计数更改为=0

>>> xpath = '//div[@class="d"]/*[not(self::table) and count(preceding-sibling::table)=0]'
>>> for x in doc.xpath(xpath): x.tag
...
'p'
'p'
'h2'
'p'
'p'
'p'