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