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

所以我试图从网站中提取表格。它是一个两列表,如下所示:


Name      Foo

Number    Foo123

Address   10

          First Drive

          London

          AB34 5FG

Region    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 个这样的页面包含类似的数据。



眼眸繁星
浏览 164回答 3
3回答

慕田峪7331174

让我们使用您提供给我们的样本。(使用此链接)让我们看看表格行是如何格式化的。<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'):&nbsp; &nbsp; header = tr.xpath('td/strong/text()').extract()[0].strip()&nbsp; &nbsp; value = tr.xpath('td')[1].xpath('text()').extract()[0].strip()&nbsp; &nbsp; print(u'{} -- {}'.format(header, value))您下一步是收集数据(制作字典?单独的列表?直接写入文件?这是您的选择。)。为了处理地址:tr如果标头为空(假设只有地址标头为空),您可以在s循环中创建一个地址变量,该变量与该值连接。像这样(再次<最小示例):for tr in response.xpath('//table[@id="MemberDetails"]/tr'):&nbsp; &nbsp; address = ''&nbsp; &nbsp; header = tr.xpath('td/strong/text()').extract()[0].strip()&nbsp; &nbsp; value = tr.xpath('td')[1].xpath('text()').extract()[0].strip()&nbsp; &nbsp; if not header: # empty strings evaluate to False&nbsp; &nbsp; &nbsp; &nbsp; address += '' + value您还必须弄清楚如何处理存储在a标签中的标头/值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python