0

私はウェブサイトからこのように形成されたテーブルを持っています:

    <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>

タグが空の場合もあります。次に例を示します。

<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」のすべての値をデータセットに取得した回数だけ、私はがらくたを取得します。

4

1 に答える 1

0

同様の問題がありました。まずrows = hxs.select('//tr')、最初の子からすべてをループします。もう少し深く掘り下げて、相対パスを使用する必要があります。このリンクは、コードを構造化する方法について優れた説明を提供します。

ようやく頭に浮かんだとき、その順序でそれぞれをitem個別に解析するために、row.selectを含めるべきではないことに気付き//ました。

お役に立てれば。

于 2013-10-16T09:44:09.243 に答える