我是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
答案 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}
因为在这个帖子上没有太多动作我只是简单地发布关于使用RegEx的快速小注意事项......已经有364个视图,只有一个答案而且是你的...偶然发现这个偶然,因为你搜索了如何...正则表达式,它不是全部[$ unknown_langue]不像大脑那样陌生(曾经在那里!)想到正则表达式我希望你能想到它这样......
公平警告
试图在一个普遍的背景下解释我如何首次开始&gt;&gt;来查看正则表达式,不需要火焰,这适用于那些刚开始的&gt;&gt;并且可以使用任何人性化的解释方式......不仅仅是来自&gt;&gt;视频或论坛回复链接到其他回复(或更糟糕的喂养&gt;&gt;人们的答案)
所以......一种模式....然后我们决定在本文中我们想要所有这些模式。
AGAIN!在发布问题的情况下,可以简单地说......
每次开始捕捉|匹配......
或切割如果你仍然在那个哈哈
我想要的所有数据数据都以http开头... 而且我们都知道结局将会发生(在这种情况下至少是lol)be .com ...那里还有.org吗?在上面发布的正则表达式中,你看到我所说的全部都是....开始使用http: (?= HTTP :) (?= etc)=这被称为积极向前看! (很多方法可以解决这个问题....)
到目前为止已选中(任何数据) HTTP:
.W + = //
到目前为止选择了......为什么?抬头看!!有一些字符数据使用&gt;通过正则表达式,所以如果他们在你的数据upi gat使用\在写它们之前...&gt;它叫做逃脱!
的http://
现在肯定它是3个charachters ... WWW +昏迷吧?所以我说选择接下来的三个
在我们知道它会处于另一个昏迷状态之前需要保持任意状态(可能是数字!! \ w ... w代表WORD!)
http://www.thiscouldgoonforininfinitybutnotuntilIreachAcomaisaystoprigh 那里。
Theres翻转到这一切! .co .io ...只有2 .com .org ......我知道你可以算......这个要点?! 1.定义你的需要! 2.确定模式 3.REGEX是一个简单而又令人头脑麻木的复杂因此...从基础知识开始并真正理解它(不难,就像在高中学习周期表,或者我们大笑点是如果你可以处理python,你肯定应该能够获得regx)