【发布时间】:2018-05-30 04:00:04
【问题描述】:
更新:
这是 html 的示例行,直接在 Chrome 中使用“复制外部 html”进行复制。我在 td 和 /td 之前添加了空格以显示实际的 html 而不会在这篇文章中触发 html:
<td class="elem">3Fb1<+1Lo<+3Sb1</td>
使用scrapy shell,我运行这个命令:
response.xpath('//table[@class="elm"][1]//td[@class="elem"]//text()')
来自响应的数据是:
3Fb1
但应该是的
3Fb1<+1Lo<+3Sb1
我相信选择器在第一个刻度('
非常感谢任何帮助。
我是 scrapy 的新手,我一直在从事一个项目(个人项目,为我的孩子)收集大量与花样滑冰得分相关的统计数据。得分统计广泛使用“
分数以表格的形式报告,“ele”的表格类和根据位置编号的表格,然后包含执行的滑冰元素和行中的分数。
一个示例评分条目(表格中的单元格)可以是:2A<
底层代码为:<td class="elem">2A&lt;</td>
或者这个:2A+1Lo<+2F
底层编码如下:
<td class="elem">2A+1Lo<+2F</td>
我已经定义了对象(可能不是正确的术语)行来迭代,然后使用它来获取特定的单元格(第二个单元格始终是执行的元素):
elements['executed_element'] = row.xpath('td[2]//text()').extract()
当刻度出现在文本末尾时(如第一个示例),我得到了所有内容,但当它位于文本中间时(第二个示例),它会截断它之后的所有内容。
我会回去手动修复,但我要提取几百万个数据点,所以这样做不切实际。
对这个新手的任何帮助将不胜感激。
抓取示例页面:http://www.usfigureskating.org/leaderboard/results/2018/25073/SEGM001.html
代码:
def parse(self, response):
event = response.xpath('//title//text()').extract()
category_segment = response.xpath('//h2[@class="catseg"]//text()').extract()
skater_number = 1
for row in response.xpath('//table[@class="sum"]/tbody/tr[not(contains(@class,"thead"))]'):
skater_name = row.xpath('td[2]//text()').extract_first()
skater_place = row.xpath('td[1]//text()').extract_first()
skater_deductions = row.xpath('td[7]//text()').extract_first()
# capture elements detail
skater_table = skater_place
elements_id = 1
element_table = '//table[@class="elm"][' + str(skater_table) +']/tbody/tr[not(contains(@class,"thead"))]'
for row in response.xpath(element_table):
elements = {}
elements['Event'] = event
elements['Category_Segment'] = category_segment
elements['skater_name'] = skater_name
elements['elements_id'] = elements_id
elements['element_number'] = row.xpath('td[@class="num"]//text()').extract()
elements['executed_element'] = row.xpath('td[2]//text()').extract()
elements['element_info'] = row.xpath('td[3]//text()').extract()
elements['base_value'] = row.xpath('td[4]//text()').extract()
elements['bonus'] = row.xpath('td[5]//text()').extract()
elements['GOE'] = row.xpath('td[6]//text()').extract()
goe_table = str('.//td[@class="jud"]')
judge_pointer = 8
judge_number = 1
elements_id += 1
for cell in row.xpath(goe_table):
elements['Judge Number'] = judge_number
elements['Judge_GOE_Score'] = row.xpath('td[' + str(judge_pointer) + ']//text()').extract()
yield elements
judge_pointer += 1
judge_number += 1
【问题讨论】:
-
最好显示此页面的网址和您的代码,以便我们对其进行测试。
-
我的代码部分(尽可能多)在 response.xpath('//table[@class="sum"]/tbody/tr[not(contains(@ class,"thead"))]'): elements_id = 1 element_table = '//table[@class="elm"][' + str(skater_table) +']/tbody/tr[not(contains(@class, "thead"))]' for row in response.xpath(element_table): elements = {} elements['element_number'] = row.xpath('td[@class="num"]//text()')。 extract() elements['executed_element'] = row.xpath('td[2]//text()').extract()
-
输入有问题的代码。它会更具可读性。
-
和网址,您也可以添加到问题中。您应该在创建问题时添加 url 和代码。
标签: python html xpath scrapy html-parsing