如何使用类ID在其中包含空格的选择器在scrapy中选择表?

时间:2014-12-06 11:59:28

标签: python xpath web-scraping scrapy

我正在尝试选择xpath类似于//*[@id="mw-content-text"]/table[@class="wikitable sortable jquery-tablesorter"]的分区内的所有表。但是选择器不返回任何值。如何通过id / class中包含空格的标签?

2 个答案:

答案 0 :(得分:2)

我无法确切地说出问题所在,因为我没有您要解析的源数据。如果您粘贴最小部分会很有帮助。

但无论如何,你有多种选择来实现这一目标。我建议将CSS选择器与XPath选择器结合使用,如下所示:

response.xpath("//*[@id='mw-content-text']").css("table.wikitable.sortable.jquery-tablesorter")

但是如果你只想使用XPath,你可以使用 contains()

response.xpath("//*[@id='mw-content-text']/table[contains(@class,'wikitable sortable jquery-tablesorter')]")

但这可能很棘手,因为它要求表 class 完全定义,它不允许类的不同排序。如果你想覆盖这些情况,我建议你这样使用它:

response.xpath("//*[@id='mw-content-text']/table[contains(@class,'wikitable') and contains(@class, 'sortable') and contains(@class, 'jquery-tablesorter')]")

您可以在Scrapy选择器in the official documentation找到更多信息。

修改
正如Rahul所注意到的,这里的问题是类jquery-tablesorter实际上是由jQuery tablesorter插件动态添加的,因此这个类在scrapy Response中不可见,因为还没有执行JS。要在解决方案中反映这一点,您不应在选择器表达式中包含jquery-tablesorter

答案 1 :(得分:0)

我有同样的问题,因为我试图刮一个维基百科页面。该表的类名显示为"wikitable sortable jquery-tablesorter",因为另一个答案中提到的插件在使用后添加到类名中。

要获取表格,您只需查找以下课程"wikitable sortable"即可。这为我挑选了代码。