为了账号安全,请及时绑定邮箱和手机立即绑定

Scrapy从没有标题的表中提取行

Scrapy从没有标题的表中提取行

眼眸繁星 2021-06-02 21:04:11
所以我试图从网站中提取表格。它是一个两列表,如下所示:Name      FooNumber    Foo123Address   10          First Drive          London          AB34 5FGRegion    United Kingdom该表没有标题,“地址”行在第一列中包含第二、城市、邮政编码等的空白单元格。我已经设法拿到了桌子,很好。table = response.xpath('//table[@id="MemberDetails"]/tr/td//text()')这是输出:[<Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'Name:\xa0'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\r\nFoo\xa0\r\n'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'Number:\xa0'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\r\nFoo123\xa0\r\n'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'Address:\xa0'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\r\n(10)\xa0\r\n'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\xa0'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\r\nFirst Drive\xa0\r\n'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\xa0'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\r\nLondon\xa0\r\n'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\xa0'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\r\nAB34 5FG\xa0\r\n'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\xa0'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\r\nUnited Kingdom\xa0\r\n'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'Region:\xa0'>, <Selector xpath='//table[@id="MemberDetails"]/tr/td//text()' data=u'\r\nUnited Kingdom\xa0\r\n'>]但是,我对如何将表解析为适当的结构感到困惑。第一个问题:不知道如何处理地址字段。第二个问题:这是一个两列的表。保存时,我想转置,“名称、号码、地址、地区”是列标题。有 1000 个这样的页面包含类似的数据。
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

让我们使用您提供给我们的样本。(使用此链接)


让我们看看表格行是如何格式化的。


<tr>

<td bgcolor="#7EADAD">

<strong>Membership Name:&nbsp;</strong>

</td>

<td>

MESSRS R J &amp; L A ACTON&nbsp;

</td>

</tr>

这对我们来说很棒,我们有不同的标题和值属性:标题strong在tds内的标签内,而bgcolor值直接在它们的tds 内。


让我们看看地址信息的空行是怎样的:


<tr>

<td bgcolor="#7EADAD">

<strong>&nbsp;</strong>

</td>

<td>

NORTHUMBERLAND&nbsp;

</td>

</tr>

很好,结构一样。


这意味着tr如果需要,我们可以遍历所有s 并根据属性获取它们的数据。这是一个不处理链接的最小示例:


for tr in response.xpath('//table[@id="MemberDetails"]/tr'):

    header = tr.xpath('td/strong/text()').extract()[0].strip()

    value = tr.xpath('td')[1].xpath('text()').extract()[0].strip()

    print(u'{} -- {}'.format(header, value))

您下一步是收集数据(制作字典?单独的列表?直接写入文件?这是您的选择。)。


为了处理地址:tr如果标头为空(假设只有地址标头为空),您可以在s循环中创建一个地址变量,该变量与该值连接。像这样(再次<最小示例):


for tr in response.xpath('//table[@id="MemberDetails"]/tr'):

    address = ''

    header = tr.xpath('td/strong/text()').extract()[0].strip()

    value = tr.xpath('td')[1].xpath('text()').extract()[0].strip()

    if not header: # empty strings evaluate to False

        address += '' + value

您还必须弄清楚如何处理存储在a标签中的标头/值。


查看完整回答
反对 回复 2021-06-15
  • 3 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信