【发布时间】:2020-09-28 15:04:30
【问题描述】:
我正在使用rvest 包从网站上抓取信息。我需要的一些信息属于iinfo" 类。不幸的是,如果我在函数html_nodes() 中使用这个字符串,我得到以下错误:
Error in parse_simple_selector(stream) :
Expected selector, got <STRING '' at 7>
这是一个代表:
library(rvest)
library(xml2)
webpage <- read_html(x = paste0("https://www.gstsvs.ch/fr/trouver-un-medecin-veterinaire.html?tx_datapool_pi1%5Bhauptgebiet%5D=3&tx_datapool_pi1%5Bmapsearch%5D=cercare&tx_datapool_pi1%5BdoSearch%5D=1&tx_datapool_pi1%5Bpointer2303%5D=",
0))
webpage_address <- webpage %>%
html_nodes('.iinfo"') %>%
html_text() %>%
gsub(pattern = "\r|\t|\n",
replacement = " ")
该类是指网站每个框中列出的地址。如果在浏览器中检查网页结构并导航到该框,则可以检索此信息。如果这样做,当你用鼠标选择地址划分时,你会看到一个带有div.iinfo\"的标志出现。
非常感谢您的帮助!
【问题讨论】:
-
HTML 类名不能包含引号。网站上的标记很简单。 rvest 在这里做了“正确的事”,但如果您想正确处理损坏的标记,您可能必须在将代码文本交给 rvest 之前手动替换出现的
class=iinfo"。 -
@KonradRudolph,我正在查看 HTML 5.1 规范,但找不到对令牌的限制。我并不惊讶,但我找不到参考,你找到了吗?具体来说,我在w3.org/TR/html51/… 中发现“令牌由零个或多个字符的任意字符串组成”。
-
(我看到的唯一限制是“没有空格字符”)
-
@nd091680 我之前的评论有点不准确:您需要在将文本传递给
read_html之前执行替换。目前,您的代码将 URL 传递给read_html,但您也可以手动下载此 URL(例如使用readLines),然后然后将下载的字符串传递给read_html。