html - 使用 nokogiri 抓取后字符串的正则表达式是什么

标签 html css ruby regex web-scraping

我有这个字符串,它位于 100 个其他格式相同的名称的 html 文档中:

<li>Physical education sed<span class="meta"><ul><li>15184745922</li></ul></span> </li>

我想将“体育 sed”保存在名称列下,将“15184745922”保存在数字列下。

我想知道你如何在 Ruby 中做到这一点。

在 nokogiri 中,我只能通过这样做得到 li 的:

puts page.css("ul li").text

但后来一口气出来了:“体育sed15184745922”

我原以为正则表达式是可行的方法,但我对此感到困惑。 我确实在 li 上拆分了它

    full_contact = page.css("ul li")[22]
    split_contact_on_li = full_contact.to_s.split(/(\W|^)li(\W|$)/).map(&:to_sym)
    puts split_contact_on_li

我明白了

<
>
Physical education sed<span class="meta"><ul>
<
>
15184745922<
/
>
</ul></span>
<
/
>

每个 contact_info 将显示相同的行数,名称始终是跨度类之前的第三行,数字始终是第六行。 在某些情况下,第 6 行可能不经常放置电子邮件地址。

那么我应该匹配第二个和第三个尖括号并将信息拉到第三个和第四个括号然后将它推到一个名为 name 和 number 的数组中吗?

最佳答案

不应该使用正则表达式 来解析 xhtml,因为正则表达式引擎可能会搞砸,您应该改用 html 解析器。但是,如果你想使用正则表达式,你可以使用这样的正则表达式:

<li>(.*?)<.*?<li>(.*?)<

Working demo

此正则表达式背后的想法是使用捕获组(使用括号)来捕获您想要的内容。因此,对于您的示例输入,匹配信息是:

MATCH 1
    Group 1.    [4-26]  `Physical education sed`
    Group 2.    [53-64] `15184745922`

例如;

#!/usr/bin/env ruby

string = "<li>Physical education sed<span class=\"meta\"><ul><li>15184745922</li></ul></span></li>"
one, two = string.match(/<li>(.*?)<.*?<li>(.*?)</i).captures

p one   #=> "Physical education sed"
p two   #=> "15184745922"

关于html - 使用 nokogiri 抓取后字符串的正则表达式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30016770/

相关文章:

Ruby 设置类 : equality of sets

ruby-on-rails - 如何测试依赖于其托管应用程序的 Rails 引擎?

javascript - 如何使用Javascript获取3个输入框值的总和?

html - Bootstrap 3 不同高度的响应列

css - 使用 Less CSS 可变字体大小

html - 文本堆叠在自身之上

css - 我在 CSS 中复制背景设计时遇到问题

asp.net - 在 Ruby 中重新实现 ASP.NET 成员资格和用户密码哈希

jquery - Twitter Bootstrap 3 修复了水平模式下的导航栏折叠

javascript - 如何使用 jQuery 单击按钮时显示幻灯片?