我正在用scrappy抓取这个page,并试图提取主表的所有行。
下面的**表达式应该给予我想要的结果:
//div[@id='TableWithRules']//tbody/tr
字符串
使用scrap shell进行测试让我注意到这个表达式确实返回了一个空数组:
#This response is empty: []
response.xpath("//div[@id='TableWithRules']//tbody").extract()
#This one is not:
response.xpath("//div[@id='TableWithRules']//thead").extract()
型
我猜网站所有者试图限制对表数据的抓取,但有没有办法找到一个解决方案?
2条答案
按热度按时间wa7juj8i1#
这是因为你试图查询一个不存在的元素。
tbody
元素通常被浏览器注入到html中,实际上在呈现之前并不存在于源html中。如果你检查页面源,你可以看到这一点。获取所有行的一个可能的解决方法是简单地绕过
tbody
标记并直接查询行:示例:
scrapy shell https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=hp
字符串
或者,如果你想跳过标题行,那么你可以这样做。
型
ldxq2e6h2#
如果您在控制台中运行此JavaScript,它将从页面中提取所有名称和描述。
字符串
使用Selenium的相同代码,例如:
型
输出
型
代码说明
首先,从
#TableWithRules
表中的tbody
中检索所有tr
元素。然后,构造一个for循环来遍历这些tr
元素,提取其中包含的所有td
元素。通常,有两个td
元素:一个用于name
,另一个用于description
。继续从td[0]
和td[1]
获取文本。什么是“头”?
THEAD
的过程与上面描述的类似。主要区别在于目标是THEAD
而不是TBODY
,并且关注th
元素而不是td
。