2016-04-10 126 views
2

我有一些Python代碼,使用scrapy刮傷bbcode論壇,我需要一個Xpath表達式,只給我發佈的文本,從引號中排除文本。 HTML看起來像這樣:排除特定的子節點與XPath和Scrapy/lxml

<td class="postbody"> 
    hi this is a response 
    <div class="bbc-block"> 
     <blockquote> 
     blah blah blah here's a quote 
     <br> 
     </blockquote> 
    </div> 
    <br> 
    and now I'm responding to what I quoted 
</td> 
<td class="postbody"> 
    <div class="bbc-block"> 
     <blockquote> 
     and now I'm responding to what I quoted 
     <br> 
     </blockquote> 
    </div> 
    <br> 
    wow what a great response 
</td> 

對於每個帖子,每頁會發生多次。我最終想要的只是每個而排除這些塊引用TD節點的文本:

  1. 你好,這是一個響應\ n和現在我回應什麼,我引述
  2. 哇什麼了很大的反響

的Python代碼我要提取這些塊如下: - 首先,我將它轉換從scrapy的HtmlResponse到LXML的HtmlElement元素類,因爲這是我能想出使用lxml.html.text_content的唯一途徑()方法:

import lxml.html as ht 

def posts_from_response(self, response): 
    dom = ht.fromstring(response.body) 
    posts = dom.xpath('//td[@class="postbody"]') 
    posts_text = [p.text_content() for p in posts] 
    return posts_text 

我搜索過廣泛幾天的解決方案,並嘗試用不同的方法附加到的

'//td[@class="postbody"][not(@class="bbc-block")]' 

一打變化,但沒有得到我正是我想用這組我想要。

有沒有1.一種方法來獲得這與一個單一的陳述,或2.一種方法來執行我的posts列表中的第二個Xpath選擇器以排除bbc塊節點?

回答

1

要獲得僅是嘗試的直接子文:

//*[@class='postbody']/text() 

爲了獲得TD所有文本元素,但忽略文本中的分度類BBC塊':

//td//text()[not(ancestor::*[@class='bbc-block'])]" 
+0

謝謝! !第二個陳述起作用(雖然有一些小的語法變化)。我在我的第一個xpath()調用中添加了.extract(),然後迭代unicode結果,創建HtmlElement對象並將它們應用於它們。 – stuart

相關問題