如果我的问题听起来太基本或一般,我道歉,但它让我困惑了很长一段时间。我是一名IT背景很少的政治学家。我对这个问题的研究并没有解决这个难题。
据说Scrapy无法抓取JavaScript或AJAX生成的网页内容。但我们怎么知道某些内容是否属于这一类别?我曾经遇到过一些在Chrome Inspect中显示的文本,但是无法通过Xpath提取(我99.9%确定我的Xpath表达式是正确的)。有人提到文本可能隐藏在某些JavaScript背后。但这仍然是猜测,我不能完全确定它不是由于错误的Xpath表达式。是否有任何迹象可以让我确定这是超出Scrapy的东西,只能处理像Selenium这样的程序?任何帮助表示赞赏。
- = - = - = - = - =
编辑(1/18/15):我正在使用的网页是http://yhfx.beijing.gov.cn/webdig.js?z=5。我要抓的特定信息用红色墨水圈出来(见下面的截图。抱歉,这是中文版)。
我可以在Chrome的Inspect中看到所需的文字,这表明要提取它的Xpath表达式应为response.xpath("//table/tr[13]/td[2]/text()").extract()
。但是,表达式不起作用。
我在Scrapy shell中检查了response.body
。所需的文字不在其中。我怀疑它是JavaScript或AJAX,但在html中,我没有看到JavaScript或AJAX的迹象。知道它是什么?
答案 0 :(得分:3)
据说Scrapy无法抓取JavaScript或AJAX生成的网页内容。但我们怎么知道某些内容是否属于这一类?
当您打开网页时,浏览器会执行很多操作。我将在这里简化过程:
Scrapy提供了工具1.和2. Selenium和Splash之类的其他工具执行3.允许您执行4.并访问呈现的HTML。
现在,我想当您想从网页中提取文本内容时,您面临三种基本情况:
<a>foo</a>
,<a href="foo" />
。内容可以通过CSS或Javascript在视觉上隐藏,但只要HTML树的一部分,我们就可以通过XPath / CSS规则提取它。<script>var cfg = {code: "foo"};</script>
。我们可以使用XPath规则找到<script>
节点,然后使用正则表达式来提取我们想要的字符串。还有一些库允许我们解析 Javascript片段,以便我们可以轻松加载对象。这里的一个复杂解决方案是通过javascript引擎执行javascript代码。你怎么知道你有哪些案件?您只需在响应正文中查找内容即可:
$ scrapy shell http://example.com/page
...
>>> 'foo' in response.body.lower()
True
如果您通过浏览器在网页中看到foo
,但上面的测试返回False
,那么内容可能是通过Ajax / XHR加载的。您必须在浏览器中检查网络活动,并查看正在执行的请求以及响应的内容。否则你就是1或2.你可以在浏览器中查看源代码并搜索内容以找出所在位置。
假设您想要的内容位于HTML标记中。你怎么知道你的XPath表达式是否正确? (在这里更正,我们的意思是为您提供您期望的输出)
好吧,如果你scrapy shell
和response.xpath(expression)
没有返回任何内容,那么你的XPath就不正确了。您应该降低表达式的特异性,直到获得包含所需内容的输出,然后缩小范围。