使用XML调用查找网页中不在源HTML中的元素

时间:2017-03-18 01:41:04

标签: python html xml scrapy

我正在抓取WebMD上不同药物的一些评级。当我转到评分页面(例如here)时,总用户评论的平均值(3.64,4.33和3.40)。我想用

拉他们
page.xpath("//p[@id='EaseOfUseSummaryValue']/text()")

(第一个数字)或

page.xpath("//p[@class='numbRating']")

(对于所有3)但这两个都返回空集(我正在使用Scrapy但使用请求和lxml遇到了同样的问题)。当我拉出较大的页面块时,评级不存在。当我点击右键并“检查元素”(我正在使用Chrome)时,它们出现在我期望的位置,但是当我查看页面的源HTML时,它们就消失了。

我假设有某种javascript魔法正在进行中。我的问题是,我如何获得这些数字?有没有一种简单的方法可以解决这个问题?数字如何显示在页面上而不是原始代码中?

2 个答案:

答案 0 :(得分:0)

当您“查看源代码”时这不会出现,但在“检查元素”时会出现,因为在大多数元素已经渲染之后,这些值是通过ajax加载的。如果使用谷歌浏览器,请进入开发人员工具,单击“网络”选项卡,然后选择“XHR”。单击“GetUserReviewSummary ......”并查看响应。您将看到此处已返回所有值。

答案 1 :(得分:0)

要回答您的主要问题 - 它不起作用,因为它期望一个值并从另一个端点动态请求数据。

您可以使用该端点作为解决方法来获得所需内容:

http://www.webmd.com/drugs/service/UserRatingService.asmx/GetUserReviewSummary?repositoryId=1&secondaryId=-1&secondaryIdValue=All%20reviews,%20conditions%20&%20overall%20rating&primaryId=' + primary_id

其中primary_id(在这种情况下为8603)实际上只是您在上面分享的网址中的drugid,如下所示:

http://webmd.com/drugs/drugreview-8603-Celexa+oral.aspx?drugid=8603&drugname=Celexa+oral&sortby=3

您可以使用默认参数返回所有评论合并:

secondaryId=-1

&安培;

secondaryIdValue=All%20reviews,%20conditions%20&%20overall%20rating

这样你就会得到一个简单的xml文档,你可以解析你的值 - 我在Jupyter做了一点测试:

enter image description here