使用python scrapy

时间:2016-09-19 18:00:16

标签: python xpath scrapy

我试图使用python scrapy在网页上提取一些数据。我不知道足够的HTML / CSS知道它是否格式良好,但它似乎不是。我感兴趣的目标信息具有如下所示的模式。表包含我有兴趣提取的一组条目(Name,Year,Int1,Int2)。但这些不在标准TD标签中,而是它们是DIV标签的一部分。这是一个例子:

<table width='100%'>
<tr>
<td width='50%'>
<div style='width: 10px; float: left'>&nbsp;</div>
     <div style='width: 232px; float: left'>Mr. Richard D. Hanson</div>
     <div style='width: 40px; float: left'>1989</div>
     <div style='width: 88px; float: left; text-align: right'>1</div>
     <div style='width: 88px; float: left; text-align: right'>27</div></td><td width='50%'><div style='width: 10px; float: left'>&nbsp;</div>
     <div style='width: 232px; float: left'>Alison G. Mills, CPA</div>
     <div style='width: 40px; float: left'>1989</div>
     <div style='width: 88px; float: left; text-align: right'>8</div>
     <div style='width: 88px; float: left; text-align: right'>12</div></td></tr><tr><td width='50%'><div style='width: 10px; float: left'>&nbsp;</div>
     <div style='width: 232px; float: left'>Mr. Timothy D. Harrell</div>
     <div style='width: 40px; float: left'>1989</div>
     <div style='width: 88px; float: left; text-align: right'>28</div>
     <div style='width: 88px; float: left; text-align: right'>28</div></td><td width='50%'><div style='width: 10px; float: left'>&nbsp;</div>
     <div style='width: 232px; float: left'>Debora R. Mitchell, PhD</div>
     <div style='width: 40px; float: left'>1989</div>
     <div style='width: 88px; float: left; text-align: right'>20</div>
     <div style='width: 88px; float: left; text-align: right'>21</div></td></tr><tr><td width='50%'><div style='width: 10px; float: left'>&nbsp;</div>
<div style='width: 232px; float: left'>Mr. Tim J. Scoggins</div>
     <div style='width: 40px; float: left'>1989</div>
     <div style='width: 88px; float: left; text-align: right'>1</div>
     <div style='width: 88px; float: left; text-align: right'>9</div>
</td>
</tr>
</table>

这是我到目前为止使用Scrapy Shell尝试的内容

尝试1:

这有效,但后来我需要将这些条目联合起来 - 即获取下面访问的每个名字的年份和Int1和Int2

>>> response.xpath('//div[@style="width: 232px; float: left"]/text()').extract()
[u'Mr. Richard D. Hanson', u'Alison G. Mills, CPA', u'Mr. Timothy D. Harrell', u'Debora R. Mitchell, PhD', u'Mr. Tim J. Scoggins']

尝试2: 在这次尝试中,我希望进行一次调用,然后迭代每个条目并将其存储在字典中。不幸的是,我不确定这里发生了什么

>>> response.xpath('//table[@width="100%"]/tr/td[@width="50%"]/div[@style="width: 10px; float: left"]/text()').extract()
[u'\xa0', u'\xa0', u'\xa0', u'\xa0', u'\xa0']

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以获取每个内部div然后split the extracted list into chunks的文本:

In [1]: data = response.xpath("//table/tr/td/div/text()").extract() 
In [2]: [data[x+1:x+5] for x in xrange(0, len(data), 5)]
Out[2]: 
[[u'Mr. Richard D. Hanson', u'1989', u'1', u'27'],
 [u'Alison G. Mills, CPA', u'1989', u'8', u'12'],
 [u'Mr. Timothy D. Harrell', u'1989', u'28', u'28'],
 [u'Debora R. Mitchell, PhD', u'1989', u'20', u'21'],
 [u'Mr. Tim J. Scoggins', u'1989', u'1', u'9']]