scrapy - 无法从<p>标签中正确提取多个URL到项目列表</p>

时间:2014-08-11 20:25:48

标签: python xpath dictionary css-selectors scrapy

我是Scrapy和Python的新手,如果这个问题听起来很傻,那么请耐心等待。我试图抓取的内容都在网站上的一个或多个段落标签内。如果它们在多个段落标记中,我很难提取字段(URL)。如果每个块的每个段落标记只有一个链接,或者在表格单元格中,我可以很容易地得到它们。但在这种情况下,即使花了一天多的时间,我也无法从多个段落标签中提取这些多个链接。

我尝试提取的内容具有以下HTML源结构:

<p class="date">June 30, 2014 </p>
<h2> SOME TITLE 1 </h2>
<p> SOME TEXT 1 <a href="http://www.link1.com">LINK 1</a> and the <a href="http://www.link2.com">LINK 2</a>.</p>

<p class="date">June 27, 2014</p>
<h2>SOME TITLE 2</h2>
<p>SOME TEXT 2-A </p>
<p>SOME TEXT 2-B <a href="meetings.php">here</a>. SOME TEXT </p>
<p>SOME TEXT 2-C <a href="website.php">WCI, Inc. website</a>, SOME TEXT. </p>

<p class="date">June 27, 2014 </p>
<h2>SOME TITLE 3 </h2>
<p>SOME TEXT 3 <a href="http://www.anotherlink.com">SOME TEXT</a>.</p>

<p><a href="news-archive.php" class="button buttonLtGray floatR">Previous Entries</a></p>

请帮忙。我的代码如下:

class Wcispider(Spider):

name = "wci"
allowed_domains = "www.wci-inc.org/"
start_urls = ["http://www.wci-inc.org/index.php"]

def parse(self, response):

    items = []
    sel = Selector(response)

    date = sel.css(".date::text")

    i = 0

    for eacDate in date:
        item = WciItem()

        item['date'] = eacDate.extract()

        item['title'] = sel.xpath('//*[@id="news"]/h2').extract()[i]
        item['url'] = sel.css(".date ~ p a").extract()[i]

        print item['date']
        print item['title']
        print item['url']
        i += 1
        items.append(item)

    return items

2 个答案:

答案 0 :(得分:2)

由于每个“新闻帖体”中可以有多个链接,因此您的一次性迭代将无效。

我会尝试在“新闻发布日期”节点下将它们组合在一起,然后循环一段时间。 (遗憾的是,你的目标文件没有包含新闻帖子:)

Scrapy Selector的一个很酷的事情是你可以在xpath电话的结果上拨打xpath。检查一下:

#get all interesting date paragraphs
date = sel.xpath('//*/p[@class="date"]')

for eacDate in date:
    #eacDate is a paragraph node
    #extract all of the paragraphs after this one at the same level in the DOM,
    #then loop until you find a date paragraph, since that marks the start of the next section
    urls = []
    next_paragraphs = eacDate.xpath("following-sibling::p")
    for p in next_paragraphs:
        if p.xpath("@class").extract() == [u'date']:
            break
        urls.extend(p.xpath("a/@href").extract())
    print urls

您可能想要阅读XPath Axes:http://www.w3schools.com/xpath/xpath_axes.asp

答案 1 :(得分:0)

  

前瞻性说明:积极展望; (?= X)

     

x =从您重新尝试匹配的单个/多个字符串的最开始!

     
  (?=http:)\w+.\/\/.{3}.\w+.{4}
  

CAPTURE ALLLLLLL MATCH THE EXPRESSION

因为在这个帖子上没有太多动作我只是简单地发布关于使用RegEx的快速小注意事项......已经有364个视图,只有一个答案而且是你的...偶然发现这个偶然,因为你搜索了如何...正则表达式,它不是全部[$ unknown_langue]不像大脑那样陌生(曾经在那里!)想到正则表达式我希望你能想到它这样......

  

公平警告

     
    

试图在一个普遍的背景下解释我如何首次开始&gt;&gt;来查看正则表达式,不需要火焰,这适用于那些刚开始的&gt;&gt;并且可以使用任何人性化的解释方式......不仅仅是来自&gt;&gt;视频或论坛回复链接到其他回复(或更糟糕的喂养&gt;&gt;人们的答案)

  
  1. 想象一下你的数据所在的整个部分是写在一张纸上......你想要一些东西吗?使用剪刀。
  2. 只有一行,多行...删除一个peice,你可以看到你想要切割的地方吗?在你想要获得的东西中必须有一个LOGIC | PATTERN(在数据挖掘的情况下,几乎总是如此)
  3. 回到现实一秒钟(哎呀......重力!!!!)显然你已经学会了规则但同样的原则,你选择你想要开始,结束,排除的地方......替代!在发布的问题中...我们想要一个跟随我们生活的模式的所有数据......每一天...... http://etc.etc.etc
  4. 所以......一种模式....然后我们决定在本文中我们想要所有这些模式。

    AGAIN!在发布问题的情况下,可以简单地说......

      

    每次开始捕捉|匹配......

         

    或切割如果你仍然在那个哈哈

    我想要的所有数据数据都以http开头...   而且我们都知道结局将会发生(在这种情况下至少是lol)be .com ...那里还有.org吗?在上面发布的正则表达式中,你看到我所说的全部都是....开始使用http:     (?= HTTP :) (?= etc)=这被称为积极向前看! (很多方法可以解决这个问题....)

      
        

    到目前为止已选中(任何数据)     HTTP:

      
         

    .W + = //

         

    到目前为止选择了......为什么?抬头看!!有一些字符数据使用&gt;通过正则表达式,所以如果他们在你的数据upi gat使用\在写它们之前...&gt;它叫做逃脱!

         
        

    的http://

      

    现在肯定它是3个charachters ... WWW +昏迷吧?所以我说选择接下来的三个

      

    http://www

    在我们知道它会处于另一个昏迷状态之前需要保持任意状态(可能是数字!! \ w ... w代表WORD!)

      

    http://www.thiscouldgoonforininfinitybutnotuntilIreachAcomaisaystoprigh   那里。

    Theres翻转到这一切! .co .io ...只有2 .com .org ......我知道你可以算......这个要点?! 1.定义你的需要! 2.确定模式 3.REGEX是一个简单而又令人头脑麻木的复杂因此...从基础知识开始并真正理解它(不难,就像在高中学习周期表,或者我们大笑点是如果你可以处理python,你肯定应该能够获得regx)