Scrapy无法识别Firebug列出的“tbody”和“ul”元素

问题描述:

我想在注册每个线程有多少个回复的同时提取此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上为我提供。

我从来没有使用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://*.com/help/how-to-ask可能会有所帮助。但是我认为,如果不给出解释性评论,就会显得不礼貌。 – Markus

+0

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