【问题标题】:Need help finding CSS selector需要帮助查找 CSS 选择器
【发布时间】:2019-12-29 13:56:41
【问题描述】:

网址:https://www.goodreads.com/book/show/985873.A_Game_of_Thrones

图书评分旁边有一个“评分详情”按钮。我试图找到 css 选择器来获取整个表格的文本,但我没有成功。有人能帮我吗?没有错误,只是没有得到我想要的文本

代码:

    book_url <- 
    read_html("https://www.goodreads.com/book/show/985873.A_Game_of_Thrones")

    book_url %>%
      html_node("table#rating_distribution") %>%
      html_text()

【问题讨论】:

  • 您遇到什么错误?哪个部分没有按预期工作?
  • 没有错误,只是没有得到我想要的文本。

标签: html web-scraping css-selectors rvest


【解决方案1】:

数据位于被 CData 屏蔽的脚本标记内。您可以正则表达式出所需的 html,然后使用 html 解析器重新解析。

library(rvest)
library(magrittr)
library(stringr)
library(stringi)

t <- read_html('https://www.goodreads.com/book/show/985873.A_Game_of_Thrones') %>% html_text()
y <- gsub('\n|\\s+',' ',stri_unescape_unicode(t[[1]][1]))
z <- str_match_all(y,'rating_details_tip\'\\), "(.*)", \\{')
tables <- read_html(z[[1]][,2])  %>% html_nodes("table") %>% html_table(fill=T)
table1 <- data.frame(tables[1])  %>% subset(., select=-c(2))
table2 <- data.frame(tables[2])


如果有兴趣,我先用python写

import requests, re
from bs4 import BeautifulSoup as bs
import pandas as pd

r = requests.get('https://www.goodreads.com/book/show/985873.A_Game_of_Thrones')
p = re.compile(r'rating_details\'\), "(.*)", {')
s = p.findall(r.text)[0].encode().decode('unicode_escape')
s = re.sub(r'\n+\s+|\\','',s )
soup = bs(s, 'lxml')
dfs = pd.read_html(str(soup.select('table')))
print(dfs)                 

【讨论】:

  • 这行得通。谢谢你。你能解释一下 stri_unescape_unicode 的作用吗?
  • 它不转义字符。所以如果有 \\char 它会正确地取消转义。
  • 我不确定这意味着什么。我最近开始学习网络抓取。你能指导我去哪里了解更多吗?
  • campus.datacamp.com/courses/… 您可能只需要一个字符串转义版本而不是 unicode。另见:google.com/…
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多