在我使用nokogiri刮之后,字符串的正则表达式是什么

Tas*_*sha 1 html css ruby regex web-scraping

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

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

我想在名单栏下保存'体育教育,在数字栏下保存'15184745922'.

我想知道你是如何用Ruby做的.

在nokogiri中我只能通过这样做获得li:

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

但后来它用一个词来形容:"体育sed15184745922"

我认为正则表达式是要走的路,但我很难过.我把它拆分了

    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
Run Code Online (Sandbox Code Playgroud)

我明白了

<
>
Physical education sed<span class="meta"><ul>
<
>
15184745922<
/
>
</ul></span>
<
/
>
Run Code Online (Sandbox Code Playgroud)

每个contact_info将显示相同数量的行,并且名称始终是span类之前的第三行,并且数字始终是第6行.有一个实例可能会有一个电子邮件地址而不是经常放在第6行.

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

Fed*_*zza 5

不应该使用正则表达式来解析xhtml,因为正则表达式引擎可能会弄乱事物,您应该使用html解析器.但是,如果要使用正则表达式,可以使用这样的正则表达式:

<li>(.*?)<.*?<li>(.*?)<
Run Code Online (Sandbox Code Playgroud)

工作演示

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

MATCH 1
    Group 1.    [4-26]  `Physical education sed`
    Group 2.    [53-64] `15184745922`
Run Code Online (Sandbox Code Playgroud)

例如;

#!/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"
Run Code Online (Sandbox Code Playgroud)