Html 使用nokogiri刮取后,字符串的正则表达式是什么

Html 使用nokogiri刮取后,字符串的正则表达式是什么,html,css,ruby,regex,web-scraping,Html,Css,Ruby,Regex,Web Scraping,我有这个字符串,它在一个包含100个其他名称的html文档中,格式相同: 体育sed15184745922 我想把“体育”和“15184745922”分别保存在名称栏和数字栏中 我想知道你是怎么用Ruby做的 在nokogiri,我只能通过以下方式获得李: put page.css(“ul-li”).text 但最后,它用一个词表达出来:“体育sed15184745922” 我原以为regex是个不错的选择,但我被它难住了。 我确实在李上把它分开了 full_contact = pag

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

  • 体育sed
    • 15184745922
  • 我想把“体育”和“15184745922”分别保存在名称栏和数字栏中

    我想知道你是怎么用Ruby做的

    在nokogiri,我只能通过以下方式获得李:

    put page.css(“ul-li”).text

    但最后,它用一个词表达出来:“体育sed15184745922”

    我原以为regex是个不错的选择,但我被它难住了。 我确实在李上把它分开了

        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
    
    我明白了

    <
    >
    体育教育sed
      < > 15184745922< / >
    < /
    >
    您不应该使用正则表达式来解析xhtml,因为正则表达式引擎可能会把事情搞砸,所以您应该使用html解析器。但是,如果要使用正则表达式,可以使用如下正则表达式:

    <li>(.*?)<.*?<li>(.*?)<
    
    比如,

    #!/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"
    
    #/usr/bin/env ruby
    string=“
  • 体育教育sed
    • 15184745922
  • ” 一,二=string.match(/
  • (.*)“15184745922”
  • 您不应该使用正则表达式来解析xhtml,因为正则表达式引擎可能会把事情搞砸,您应该使用html解析器。但是,如果您想使用正则表达式,可以使用如下正则表达式:

    <li>(.*?)<.*?<li>(.*?)<
    
    比如,

    #!/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"
    
    !/usr/bin/env ruby
    string=“
  • 体育教育sed
    • 15184745922
  • ” 一,二=string.match(/
  • (.*)“15184745922”
  • 为什么不在字符串“physical education sed15184745922”上执行正则表达式?您可以在第一个数字上进行匹配,然后返回数字和前面的文本。

    为什么不在字符串“physical education sed15184745922”上执行正则表达式?您可以匹配第一个数字,并返回数字和前面的文本。

    我不知道如何使用Ruby,但如果我正确理解您的问题,我将利用gsub函数(或Ruby的等效函数)。这可能不是最漂亮的方法,但由于我们只希望文本在一个变量中,数字在另一个变量中,我们可以用空值替换不需要的字符

    v1 = page.css('ul li').text
    v2 = gsub('\d*', '', v1)
    v3 = gsub('(^\d)', '', v1)
    
    v1获取全文值,v2将所有数字字符替换为“”,v3将所有字母字符替换为“”,这给了我们两个新变量,让我们可以随意放置


    同样,我不知道如何使用Ruby,但在R中,我知道我可以使用您提供的xpath(“ul-li”)从页面获取所有值我不确定这是否足以回答您的问题,但希望gsub函数能让您更接近您想要的内容。

    我不知道如何使用Ruby,但如果我正确理解您的问题,我会利用gsub函数这可能不是最漂亮的方法,但因为我们只需要一个变量中的文本和另一个变量中的数字,我们可以用空值替换不需要的字符

    v1 = page.css('ul li').text
    v2 = gsub('\d*', '', v1)
    v3 = gsub('(^\d)', '', v1)
    
    v1获取全文值,v2将所有数字字符替换为“”,v3将所有字母字符替换为“”,这给了我们两个新变量,让我们可以随意放置


    同样,我不知道如何使用Ruby,但在R中,我知道我可以使用您提供的xpath(“ul-li”)从页面获取所有值然后在向量中循环,对每个元素执行上述步骤。我不确定这是否充分回答了您的问题,但希望gsub函数能让您更接近您想要的内容。

    您需要使用HTML解析器(Nokogiri)首先,使用Nokogiri向下遍历到第一个父节点,该节点包含您需要的所有文本,然后将文本正则化以获得您需要的文本

    也可以考虑使用<代码> .xPath < /C> >而不是<代码> .CSS。它提供了更多的功能来搜索和擦除你想要的东西。

    page.xpath("//span[@class='meta']/parent::li").map do |i|
      i.text.scan(/^([a-z\s]+)(\d+)$/i).flatten
    end
    
    #=> [['Physical education sed', '15184745922'], ['the next string', '1234567890'], ...]
    
    现在你有了一个二维数组,你可以迭代并保存每一对


    这一点xpath业务:
    “//span[@class='meta']/parent::li”
    正在做
    .css
    做不到的事情,返回包含文本和特定子节点的父节点。您需要使用HTML解析器(Nokogiri)首先,使用Nokogiri向下遍历到第一个父节点,该节点包含您需要的所有文本,然后将文本正则化以获得您需要的文本

    也可以考虑使用<代码> .xPath < /C> >而不是<代码> .CSS。它提供了更多的功能来搜索和擦除你想要的东西。

    page.xpath("//span[@class='meta']/parent::li").map do |i|
      i.text.scan(/^([a-z\s]+)(\d+)$/i).flatten
    end
    
    #=> [['Physical education sed', '15184745922'], ['the next string', '1234567890'], ...]
    
    现在你有了一个二维数组,你可以迭代并保存每一对


    这一点xpath业务:
    “//span[@class='meta']/parent::li”正在做<代码> > CSS不能做,返回有文本和父节点的父节点要删除。

    谢谢你的建议,我将查看HTML解析器。@塔沙,如果你认为你的问题解决了,别忘了把它标记为解决。BTW,如果你已经找到了你自己的答案,请。发布并将您的问题标记为已解决。这将帮助社区避免发布新答案:)怎么做?有一个按钮吗?@塔沙,是的…你可以在每个答案的投票下面找到一个嘀嗒按钮。你可以检查你认为答案回答你的问题的答案。谢谢你的建议,我会看一下HTML解析器。@塔沙,如果你认为你的问题已经解决了,别忘了把它标记为解决。BTW,如果你已经找到了你的答案。请发布自己的答案,并将您的问题标记为已解决。这将帮助社区避免发布新答案:)怎么做?有按钮吗?@Tasha,是的……您可以找到一个勾号按钮