嘿,以下问题我从网站上得到一张这样的表:
<table>
<tr class="head">
<td class="One">
Column 1
</td>
<td class="Two">
Column 2
</td>
<td class="Four">
Column 3
</td>
<td class="Five">
Column 4
</td>
</tr>
<tr class="DataSet1">
<td class="One">
<table>
<tr>
<td class="DataType1">
Data 1
</td>
</tr>
<tr>
<td class="DataType_2">
<ul>
<li> Data 2a</li>
<li> Data 2b</li>
<li> Data 2c</li>
<li> Data 2d</li>
</ul>
</td>
</tr>
</table>
</td>
<td class="Two">
<table>
<tr>
<td class="DataType_3">
Data 3
</td>
</tr>
<tr>
<td class="DataType_4">
Data 4
</td>
</tr>
</table>
</td>
<td class="Three">
<table>
<tr>
<td class="DataType_5">
Data 5
</td>
</tr>
</table>
</td>
<td class="Four">
<table>
<tr>
<td class="DataType_6">
Data 6
</td>
</tr>
</table>
</td>
</tr>
<tr class="Empty">
<td class="One">
</td>
<td class="Two">
</td>
<td class="Four">
</td>
<td class="Five">
</td>
</tr>
<tr class="DataSet2">
<td class="One">
<table>
<tr>
<td class="DataType_1">
Data 7
</td>
</tr>
<tr>
<td class="DataType_2">
Data 8
</td>
</tr>
</table>
</td>
<td class="Two">
<table>
<tr>
<td class="DataType_3">
Data 9
</td>
</tr>
<tr>
<td class="DataType_4">
Data 10
</td>
</tr>
</table>
</td>
<td class="Three">
<table>
<tr>
<td class="DataType_5">
Data 11
</td>
</tr>
</table>
</td>
<td class="Four">
<table>
<tr>
<td class="DataType_6">
Data 12
</td>
</tr>
</table>
</td>
</tr>
<!-- and so on -->
</table>
标签有时也是emtpy
<td class="DataType_6> </td>
我尝试使用scrapy和以下脚本废弃内容:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from project.items import ProjectItem
class MySpider(BaseSpider):
name = "SpiderName"
allowed_domains = ["url"]
start_urls = ["url"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
rows = hxs.select('//tr')
items = []
item = ProjectItem()
item["Data_1"] = rows.select('//td[@class="DataType_1"]/text()').extract()
item["Data_2"] = rows.select('//td[@class="DataType_2"]/text()').extract()
item["Data_3"] = rows.select('//td[@class="DataType_3"]/text()').extract()
item["Data_4"] = rows.select('//td[@class="DataType_4"]/text()').extract()
item["Data_5"] = rows.select('//td[@class="DataType_5"]/text()').extract()
item["Data_6"] = rows.select('//td[@class="DataType_6"]/text()').extract()
items.append(item)
return items
如果我现在通过
抓取scrapy crawl SpiderName -o output.csv -t csv
我只得到了几次废话,因为我得到了数据集“Data_1”的所有值
答案 0 :(得分:0)
有类似的问题。首先,rows = hxs.select('//tr')
将从第一个孩子开始循环。你需要深入挖掘,并使用相对路径。 This link为如何构建代码提供了很好的解释。
当我最终了解它时,我意识到按顺序分别解析每个item
,row.select
不应该包含//
。
希望这有帮助。