美好的一天,
我正在尝试使用Scrapy来反复获取网站的信息。 Startpoint是一个列出URL的站点。我使用以下代码获取Scrapy的URL: 第1步:
def parse(self, response):
for href in response.css('.column a::attr(href)'):
full_url = response.urljoin(href.extract())
yield { 'url': full_url, }
然后对于每个URL,我将查找包含关键字的特定URL(我现在正在分离每个步骤,因为我是Scrapy的新手。最后我想通过一个蜘蛛运行它): 第2步:
def parse(self, response):
for href in response.xpath('//a[contains(translate(@href,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"),"keyword")]/@href'):
full_url = response.urljoin(href.extract())
yield { 'url': full_url, }
到目前为止一切顺利,但最后一步:
第3步: 我想从返回的URL中获取具体信息,如果有的话。现在我遇到了麻烦; o)我试图共犯:
因此,当您使用下面的HTML代码时,我想返回父div()的内容。请注意,我不知道该课程,所以我无法与之匹敌。
<html>
<head>
<title>Webpage</title>
</head>
<body>
<h1 class="bookTitle">A very short ebook</h1>
<p style="text-align:right">some text</p>
<div class="contenttxt">
<h1>Info</h1>
<h4>header text</h4>
<p>something<br />
1234 AB</p>
<p>somthing else</p>
</div>
<h2 class="chapter">Chapter One</h2>
<p>This is a truly fascinating chapter.</p>
<h2 class="chapter">Chapter Two</h2>
<p>A worthy continuation of a fine tradition.</p>
</body>
</html>
我试过的代码:
2016-05-31 18:59:32 [scrapy] INFO: Spider opened
2016-05-31 18:59:32 [scrapy] DEBUG: Crawled (200) <GET http://localhost/test/test.html> (referer: None)
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x7f6bc2be0e90>
[s] item {}
[s] request <GET http://localhost/test/test.html>
[s] response <200 http://localhost/test/test.html>
[s] settings <scrapy.settings.Settings object at 0x7f6bc2be0d10>
[s] spider <DefaultSpider 'default' at 0x7f6bc2643b90>
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
>>> response.xpath('//*').re('([0-9][0-9][0-9][0-9].*[A-Z][A-Z])')
[u'1234 AB', u'1234 AB', u'1234 AB', u'1234 AB']
首先,它返回匹配4次,所以至少它可以找到一些东西。我搜索了'scrapy xpath return parent node',但这只给了我一个“解决方案”,只获得了一个结果:
>>> response.xpath('//*/../../../..').re('([0-9][0-9][0-9][0-9].*[A-Z][A-Z])')
[u'1234 AB']
我也尝试过这样的事情:
>>> for nodes in response.xpath('//*').re('([0-9][0-9][0-9][0-9].*[A-Z][A-Z])'):
... for i in nodes.xpath('ancestor:://*'):
... print i
...
Traceback (most recent call last):
File "<console>", line 2, in <module>
AttributeError: 'unicode' object has no attribute 'xpath'
但这也没有帮助。 希望有人可以指出我正确的方向。首先,因为我不知道为什么正则表达式匹配4次,其次是因为我没有想到达到我想要的地方。刚刚回顾了大多数有希望的结果,即“可能已经有你答案的问题”。但没有找到我的解决方案。我最好的猜测是我必须构建某种循环,但是再一次,没有任何线索。 :■
最后,我尝试获取一个输出结果,其中包含在步骤1和步骤2中找到的URL以及步骤3中的数据。
谢谢! KR, ONNO。
答案 0 :(得分:0)
re
方法在xpath选择器提取感兴趣的元素后提取数据,请查看documentation以获取更多信息。如果您知道元素(在这种情况下可能是div
),您可以遍历检查其内容的所有div或使用scrapy对XPath中正则表达式的内置支持;使用您之前的示例,如下所示:
response.xpath('//div[re:test(., "[0-9]{4}\s?[A-Z]{2}")]').extract()
返回
[u'<div class="contenttxt">\n <h1>Info</h1>\n <h4>header text</h4>\n\n <p>something<br>\n 1234 AB</p>\n\n <p>somthing else</p>\n </div>']