2016-08-02 65 views
-1

我想在註冊每個線程有多少個回覆的同時提取此mailing list的每個標題。Scrapy無法識別Firebug列出的「tbody」和「ul」元素

根據螢火蟲,所述XPath來的<ul>包含所有的標題是:

/HTML /體/表[2]/tbody的/ TR 1/TD [2] /表/ TBODY/TR/TD/UL

然而,如果我粘貼此直接在Scrapy殼牌,它會產生一個空列表:

scrapy shell http://seclists.org/fulldisclosure/2002/Jul/index.html 
response.xpath('/html/body/table[2]/tbody/tr[1]/td[2]/table/tbody/tr/td/ul') 
[] 

一些試驗和錯誤之後(因爲我無法從文檔中找出列出給定Selector中的直接子元素的方法(請告訴他們是否知道其中的一個),我發現元素「tbody」在Xpath上不起作用。通過去除它們,我能夠達到導航到/td

almost_email_threads = response.xpath('/html/body/table[2]/tr[1]/td[2]/table/tr/td') 

但是,如果我現在試圖達到「UL」它不會工作:

email_threads.xpath('/ul') 
[] 

現在,混淆了我最是運行:

response.xpath('/html/body/table[2]/tr[1]/td[2]/table/tr/td//ul') 

給我UL的,但不是在相同的順序出現在網站上。它以不同的順序跳過線程。此外,似乎不可能計算每個線程的回覆數量。

我在這裏錯過了什麼?自從我使用Scrapy以來已經有一段時間了,但我不記得這很難弄清楚,無論出於何種原因,教程都不會在Bing或Google上爲我提供。

回答

-2

我從來沒有使用Firebug的,但看着你指的HTML頁面,我會說,下面的XPath表達式將會給你所有頂級主題:

//li[not(ancestor::li) and ./a/@name] 

從每個列表元素開始,你那麼需要計算列表子項的數量以獲得對任何給定線程的回覆量。

使用Scrapy殼,這會導致:

> scrapy shell http://seclists.org/fulldisclosure/2002/Jul/index.html 
In [1]: threads = response.xpath('//li[not(ancestor::li) and ./a/@name]') 
In [2]: for thread in threads: 
    ...:  print thread, len(thread.xpath('descendant::li')) 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="0" href="0">Testing</a> <em'> 0 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="1" href="1">full disclosure'> 4 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="3" href="3">The Death Of TC'> 1 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="7" href="7">Re: Announcing '> 24 
[...] 

關於你如何列出從指定選擇所有子元素的問題,你只需要認識到,上運行的XPath查詢的結果一個選擇器是一個SelectorList其中每個列表元素實現接口Selector。因此,您可以簡單地將XPath再次用於例如列出所有的孩子:

In [3]: thread.xpath('child::*') 
Out[3]: 
[<Selector xpath='child::*' data=u'<a name="309" href="309">it\'s all about '>, 
<Selector xpath='child::*' data=u'<em>Florin Andrei (Jul 31)</em>'>, 
<Selector xpath='child::*' data=u'<ul>\n<li><a name="313" href="313">it\'s a'>] 
+0

謝謝。它似乎在這裏工作。我會等着看是否有人知道如何在Spacy上列出選擇器的答案,或者想要提出任何其他建議,如果沒有,我會在這裏接受你的答案。我也贊同你的回答。你知道爲什麼我的問題和答案都被低估了嗎?當他們不評論改善,而不是簡單的下調時,很難改善。 –

+1

我已更新答案,向您展示如何獲得答覆的數量和選擇器的子代。關於你的問題的反對票,我只能推測;可能會認爲它不包含MCV示例並且至少有一個格式錯誤。看看http://stackoverflow.com/help/how-to-ask可能會有所幫助。但是我認爲,如果不給出解釋性評論,就會顯得不禮貌。 – Markus

+0

謝謝。我接受了你的答案。 –