我正在抓取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魔法正在进行中。我的问题是,我如何获得这些数字?有没有一种简单的方法可以解决这个问题?数字如何显示在页面上而不是原始代码中?
答案 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做了一点测试: