我想做一个爬虫,它从一个url(page1)开始,然后通过一个链接指向一个新的页面page2。在第2页,它应该跟在第3页的链接后面。然后我想在第3页上收集一些数据。在
但是,我不擅长抓取,不能让回调函数工作。我的代码是:
class allabolagnewspider(CrawlSpider):
name="allabolagnewspider"
# allowed_domains = ["byralistan.se"]
start_urls = [
"http://www.allabolag.se/5565794400/befattningar"
]
rules = (
Rule(LinkExtractor(allow = "http://www.allabolag.se",
restrict_xpaths=('//*[@id="printContent"]//a[1]'),
canonicalize=False),
callback='parse_link1'),
)
def parse_link1(self, response):
hxs = HtmlXPathSelector(response)
return Request(hxs.xpath('//*[@id="printContent"]/div[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/a').extract(), callback=self.parse_link2)
def parse_link2(self, response):
for sel in response.xpath('//*[@id="printContent"]'):
item = AllabolagnewItem()
item['Byra'] = sel.xpath('/div[2]/table/tbody/tr[3]/td/h1').extract()
item['Namn'] = sel.xpath('/div[2]/table/tbody/tr[3]/td/h1').extract()
item['Gender'] = sel.xpath('/div[2]/table/tbody/tr[3]/td/h1').extract()
item['Alder'] = sel.xpath('/div[2]/table/tbody/tr[3]/td/h1').extract()
yield item
但是,当我运行它时,我收到以下错误消息: TypeError:请求url必须是str或unicode,获取列表:
如果我没有弄错,当我试图返回parse_link1的请求时,我会搞砸。我该怎么办?在
编辑:
以下是工作代码(虽然仍有一些问题,但具体问题已解决):
^{pr2}$
在
parse_link1
中,您将传递一个列表,它是SelectorList
上的.extract()
的结果(在hxs
选择器上调用.xpath()
的结果),作为url
的值,Request
构造函数的第一个参数,而预期只有一个值。在使用
.extract_first()
代替:OP评论后编辑
^{pr2}$这是由于XPath表达式“过于保守”,可能是您的浏览器Inspect工具给出的(我在Chrome中测试了XPath,它适用于this example page)
问题在于
.../table/tbody/tr/...
。问题是<tbody>
很少有人编写的真正的HTML页面,甚至是模板(由人编写)。 HTML希望一个<table>
有一个<tbody>
,但是没有人真正关心,浏览器处理得很好(并且他们注入丢失的<tbody>
元素来承载<tr>
行)因此,尽管它不是严格等价的XPath,但通常可以:
tbody/
并使用table/tr
模式table//tr
使用
scrapy shell
查看它的实际操作:此外,您还需要:
@href
)response.urljoin()
是一个方便的快捷方式继续在破壳中:
最后,您的回调可能会变成:
hxs.xpath(...).extract()
返回的是列表而不是字符串。 尝试迭代生成请求的列表,或者从列表中选择所需的正确url。在之后,只有当页面中的链接是绝对路径时,它才会起作用。如果你需要建立绝对路径的话。在
相关问题 更多 >
编程相关推荐