Capybara / Ruby - 尝试仅从所有不明确的 css 选择器中获取文本并将其转换为字符串
Capybara / Ruby - Trying to get only the Text from all ambiguous css selector and convert it to string
我正在尝试从特定 CSS 选择器中获取在 HTML 中不明确的所有文本。我想访问这些模棱两可的 css 并获取文本,然后 return 所有信息。
我已经想出了如何找到所有不明确的选择器,但我不知道如何只从每个选择器中获取文本。
二义性选择器是(它找到了 3 个匹配器)
.list-card-title .js-card-name
我已经尝试过如下命令:
arr = Array(3)
arr = find_all('.list-card-title.js-card-name').to_a
puts arr.to_s
当我使用 puts arr
我得到了以下输出
[#<Capybara::Node::Element tag="span" path="/HTML/BODY[1]/DIV[2]/DIV[2]/DIV[1]/DIV[2]/DIV[3]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/DIV[1]/DIV[2]/A[1]/DIV[3]/SPAN[1]">, #<Capybara::Node::Element tag="span" path="/HTML/BODY[1]/DIV[2]/DIV[2]/DIV[1]/DIV[2]/DIV[3]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/DIV[1]/DIV[2]/A[2]/DIV[3]/SPAN[1]">, #<Capybara::Node::Element tag="span" path="/HTML/BODY[1]/DIV[2]/DIV[2]/DIV[1]/DIV[2]/DIV[3]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/DIV[1]/DIV[2]/A[3]/DIV[3]/SPAN[1]">]
要获取元素的文本,您需要对每个元素调用 text
。在您的情况下,最简单的方法是
find_all('.list-card-title.js-card-name').map(&:text)
这将 return 每个元素中包含的文本数组。如果您希望将所有这些连接成一个字符串,您可以这样做
find_all('.list-card-title.js-card-name').map(&:text).join
注意:您用 automated-tests
标记了您的问题,您实际上是在测试 app/site,还是在进行网络抓取?如果你正在测试,你最好使用 Capybaras expectation/assertion 方法(以及他们接受的 :text 选项)编写测试,而不是查找元素,extracting/manipulating 包含文本然后做一些事情(我假设断言)。
我正在尝试从特定 CSS 选择器中获取在 HTML 中不明确的所有文本。我想访问这些模棱两可的 css 并获取文本,然后 return 所有信息。
我已经想出了如何找到所有不明确的选择器,但我不知道如何只从每个选择器中获取文本。
二义性选择器是(它找到了 3 个匹配器)
.list-card-title .js-card-name
我已经尝试过如下命令:
arr = Array(3)
arr = find_all('.list-card-title.js-card-name').to_a
puts arr.to_s
当我使用 puts arr
我得到了以下输出
[#<Capybara::Node::Element tag="span" path="/HTML/BODY[1]/DIV[2]/DIV[2]/DIV[1]/DIV[2]/DIV[3]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/DIV[1]/DIV[2]/A[1]/DIV[3]/SPAN[1]">, #<Capybara::Node::Element tag="span" path="/HTML/BODY[1]/DIV[2]/DIV[2]/DIV[1]/DIV[2]/DIV[3]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/DIV[1]/DIV[2]/A[2]/DIV[3]/SPAN[1]">, #<Capybara::Node::Element tag="span" path="/HTML/BODY[1]/DIV[2]/DIV[2]/DIV[1]/DIV[2]/DIV[3]/DIV[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/DIV[1]/DIV[2]/A[3]/DIV[3]/SPAN[1]">]
要获取元素的文本,您需要对每个元素调用 text
。在您的情况下,最简单的方法是
find_all('.list-card-title.js-card-name').map(&:text)
这将 return 每个元素中包含的文本数组。如果您希望将所有这些连接成一个字符串,您可以这样做
find_all('.list-card-title.js-card-name').map(&:text).join
注意:您用 automated-tests
标记了您的问题,您实际上是在测试 app/site,还是在进行网络抓取?如果你正在测试,你最好使用 Capybaras expectation/assertion 方法(以及他们接受的 :text 选项)编写测试,而不是查找元素,extracting/manipulating 包含文本然后做一些事情(我假设断言)。