【问题标题】:Scraping dates in Tripadvisor with xpath使用 xpath 在 Tripadvisor 中抓取日期
【发布时间】:2016-03-11 02:08:51
【问题描述】:

我正在努力从tripadvisor 的评论中获取日期。

我开始:

https://www.tripadvisor.es/Hotel_Review-g562819-d237083-Reviews-or150-Hotel_Riu_Don_Miguel-Playa_del_Ingles_Maspalomas_Gran_Canaria_Canary_Islands.html#REVIEWS

日期有两种格式:普通的 DD/MM/YYYY 格式 Opinión escrita el 21 mayo 2010 和相对日期格式 Opinión escrita hace 4 días

'普通格式'有一个名为ratingDate的类

<span class="ratingDate">Opinión escrita el 25 octubre 2006</span>

'相对格式'有两个类ratingDaterelativeDate

<span title="6 marzo 2016" class="ratingDate relativeDate">Opinión escrita hace 4 días</span>

我正在使用 R 和 rvest 包来报废日期。

url_hotel <- "https://www.tripadvisor.es/Hotel_Review-g562819-d237083-Reviews-or150-Hotel_Riu_Don_Miguel-Playa_del_Ingles_Maspalomas_Gran_Canaria_Canary_Islands.html#REVIEWS"
html_hotel <- url_hotel %>% read_html()

这是我的问题。当我尝试使用此代码取消日期时

dates <- html_hotel %>% html_nodes(".ratingDate")

我只得到'正常日期',而没有得到其他日期。

试图找到解决方案我到达了here 但是

dates <- html_hotel %>% html_nodes(xpath="//*[contains(concat(' ', normalize-space(@class), ' '), ' ratingDate ')]")

不工作。我一直得到相同的结果。

Here 有人试图从 Tripadvisor 获取相同的数据,但使用的是 Python。他的回答都不管用

dates <- html_hotel %>% html_nodes(xpath='//div[@class="col2of2"]//span[@class="ratingDate relativeDate"/@title or @class="ratingDate"]')   

有没有什么办法,设置一个好的 XPath 或其他东西,来获取 '相对日期'

提前致谢。

【问题讨论】:

  • 我猜你需要其他包:dates &lt;- html_nodes(".ratingDate") Error in UseMethod("xml_find_all") : no applicable method for 'xml_find_all' applied to an object of class "character"。并且...对于 R DD/MM/YYYY 不是“正常格式”,假设您期望“正常”是默认的。
  • @42 感谢您的评论。你得到一个错误,因为代码是错误的。对不起。这是我的错。它已经被纠正了。 “正常格式”只是一个名称,用于指代不是“相对日期”的日期。我可以得到这个“正常日期”并在 R 中使用它。问题是我无法得到“相对日期”。我想是一个糟糕的 Xpath。

标签: r xpath web-scraping rvest


【解决方案1】:

这是我的猜测,但由于我们不共享语言环境,因此您的日期与我的日期的拼写不同,并且代码在我的语言环境中提供 NA,但试试这个(基于我怀疑是正确的日期格式你的语言环境:

 dates %>%
   html_attr("title") %>%
   strptime("%d %B %Y") %>%
   as.POSIXct()

取自https://github.com/hadley/rvest/blob/master/demo/tripadvisor.R

【讨论】:

  • 谢谢@42。也许,我的解释不清楚。该网站有 10 条评论。使用dates &lt;- html_hotel %&gt;% html_nodes(".ratingDate"),我得到一个包含八个元素的列表,其中包含八个第一个日期,我可以使用date %&gt;% gsub("Opinión escrita el |\n","",.) %&gt;% dmy() 将它们转换为POSIXct 对象。但是,这就是问题所在,我无法获得最后两个日期。他们有class="ratingDate relativeDate",我不能用dates &lt;- html_hotel %&gt;% html_nodes(".ratingDate") 废弃它们。所以,我想知道 html_node 函数的参数将如何废弃这些日期。谢谢
  • 当我使用“查看源代码”工具查看交付给 Chrome 的页面时,只有 8 个项目具有“ratingDate”类,可见页面上只有 8 个意见部分有日期)。两个意见改为“Opinión escrita hace 5 días”。还有其他日期,但不是那个班级。我使用dates2 &lt;- html_hotel %&gt;% html_nodes(".date") 获得了另外 9 个节点,其中三个似乎是“意见日期”。
  • 此外,如果我要求网站提供美式英语翻译,我现在会在来源和使用您的编码搜索“.ratingDate”时看到 10 个 ratingDate 值。
  • 再次感谢您的帮助。但是如果我去这家酒店的页面#60美国英语tripadvisor.com,我发现同样的问题。 url %&gt;% html_read() %&gt;% html_nodes(".ratingDate") 仅给出 10 条评论中的 8 个节点。我想这一定是css选择器的问题,但我找不到解决方案,我要疯了。
  • 比较源而不是渲染页面。
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2023-03-13
相关资源
最近更新 更多