首页 文章

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

提问于
浏览
-1

我正在尝试提取此mailing list的每个 Headers ,同时注册每个线程有多少回复 .

根据Firebug,包含所有 Headers 的 <ul> 的Xpath是:

/ html / body / table [2] / tbody / tr1 / td [2] / table / tbody / tr / td / ul

但是,如果我将它直接粘贴到Scrapy Shell中,它将产生一个空列表:

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')
[]

经过一些试验和错误(因为我无法在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 .

1 回答

  • -2

    我从来没有使用过Firebug,但是看看你引用的HTML页面,我会说下面的XPath表达式将为你提供所有顶级线程:

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

    从每个列表元素开始,您需要计算列表子项的数量,以获得对任何给定线程的回复量 .

    使用Scrapy shell,会导致:

    > 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'>]
    

相关问题