【问题标题】:How to merge 3 hashes?如何合并 3 个哈希值?
【发布时间】:2023-02-06 21:41:40
【问题描述】:

我一直在尝试从表中获取一些信息到散列中,所以这是我有一个如下所示的 HTML 表的代码,我提取 party_names 和类型并将它们合并到单个散列中。现在我需要将另一个散列与派对地址合并。我能够获得地址,但表结构有点不寻常,所以我不确定如何将参与方地址与拥有该地址的参与方名称合并。

    require 'nokogiri'

html = '    <table class="detailRecordTable"><tbody><tr>
                                                        <td width="3%" class="detailSeperator" style="width:3%;"></td>
                                                        <td width="30%" class="detailSeperator" style="width:30%;text-align:left">
                                                                SMALL   , DANIEL, Appellant&nbsp;&nbsp;&nbsp            </td>       <td width="20%" class="detailSeperator" style="width:20%;font-weight: normal">  represented by&nbsp;&nbsp;&nbsp;
                                                        </td>
                                                        <td width="47%" class="detailSeperator" style="width:47%;text-align:left">
                                                                KELLY   , MARK EDWARD
                                                                , Attorney for Appellant
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td width="3%" class="detailData" style="width:3%;text-align:right">
                                                        </td>
                                                        <td width="30%" class="detailData">

                                                        </td>   <td width="20%" class="detailData">

                                                        </td><td width="47%" class="detailData">
                                                                    134 N WATER STREET<br>
                                                                    LIBERTY,
                                                                    MO
                                                                    64068<br>   <br>
                                                            <p></p>
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td width="3%" class="detailData">&nbsp;</td>
                                                        <td width="30%" class="detailData">&nbsp;</td>
                                                        <td width="20%" class="detailData">&nbsp;</td>
                                                        <td width="47%" class="detailData"></td>
                                                    </tr>

                                                    <tr>
                                                        <td class="detailSeperator" style="width:3%;text-align:right"></td>
                                                        <td class="detailSeperator" style="width:30%;text-align:left"></td>
                                                        <td class="detailSeperator" style="width:20%;font-weight: normal">co-counsel</td>
                                                        <td class="detailSeperator" style="width:47%;text-align:left">
                                                            PITTMAN     , KRISTI LANAE  , Co-Counsel for Appellant</td>
                                                    </tr>
                                                    <tr>
                                                        <td width="3%" class="detailData">&nbsp;</td>
                                                        <td width="30%" class="detailData">&nbsp;</td>
                                                        <td width="20%" class="detailData">&nbsp;</td>
                                                        <td width="47%" class="detailData">
                                                                134 NORTH WATER STREET<br>
                                                                LIBERTY,
                                                                MO
                                                                64068<br>               <br>

                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td width="3%" class="detailSeperator" style="width:3%;">&nbsp;
                                                        </td>
                                                        <td width="30%" class="detailSeperator" style="width:30%;text-align:left">
                                                                RED SIMPSON, INC.
                                                                , Respondent&nbsp;&nbsp;&nbsp;
                                                        </td>

                                                        <td width="20%" class="detailSeperator" style="width:20%;font-weight: normal">  represented by&nbsp;&nbsp;&nbsp;
                                                        </td>
        <td width="47%" class="detailSeperator" style="width:47%;text-align:left">
                                                                GREENWALD   , DOUGLAS   MARK
                                                                , Attorney for Respondent
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td width="3%" class="detailData" style="width:3%;text-align:right">
                                                        </td>
                                                        <td width="30%" class="detailData">
                                                        </td>
                                                        <td width="20%" class="detailData">

                                                        </td>

                                                        <td width="47%" class="detailData">

                                                                    10 EAST CAMBRIDGE CIRCLE DRIVE<br>
                                                                    KANSAS CITY,
                                                                    KS
                                                                    66103<br><br>
                                                            <p></p>
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td width="3%" class="detailData">&nbsp;</td>
                                                        <td width="30%" class="detailData">&nbsp;</td>
                                                        <td width="20%" class="detailData">&nbsp;</td>
                                                        <td width="47%" class="detailData"></td>
                                                    </tr>

                                                    <tr>
                                                        <td class="detailSeperator" style="width:3%;text-align:right"></td>
                                                        <td class="detailSeperator" style="width:30%;text-align:left"></td>
                                                        <td class="detailSeperator" style="width:20%;font-weight: normal">co-counsel</td>
                                                        <td class="detailSeperator" style="width:47%;text-align:left">
                                                            BENJAMIN, SAMANTHA  NICOLE
                                                            , Co-Counsel for Respondent</td>
                                                    </tr>
                                                    <tr>
                                                        <td width="3%" class="detailData">&nbsp;</td>
                                                        <td width="30%" class="detailData">&nbsp;</td>
                                                        <td width="20%" class="detailData">&nbsp;</td>
                                                        <td width="47%" class="detailData">

                                                                MCANANY VAN CLEVE AND PHILLIPS<br>

                                                                10 E CAMBRIDGE CIRCLE DR<br>

                                                                STE 300<br>

                                                                KANSAS CITY,
                                                                KS
                                                                66103<br>
                                                            <b>Business: </b>
                                                            (913)
                                                            573-3319 <br>   <br>

                                                        </td>
                                                    </tr>

                                </tbody></table>'

doc = Nokogiri::HTML(html)
rows = doc.xpath("//table[@class='detailRecordTable']//tr")
# address2 = doc.css('td:nth-of-type(4)').text.strip

# puts address2

@party_names = []
@party_types = []
@party_des = []

rows.each do |row|
  nodes = row.css('.detailSeperator:nth-of-type(2), .detailSeperator:nth-of-type(4)')
  nodes.each do |node|
    name = node.text.strip.gsub("\n", '').gsub("\t", '')
    parts = name.split(',')
    name = if parts.length == 3
             "#{parts[0]}, #{parts[1]}"
           else
             parts[0]
           end
    party_type = parts[-1].strip if parts && parts.length >= 2
    addr = ("#{parts[0]}, #{parts[1]}" if parts.length == 2)
    @party_names << name
    @party_types << party_type
    @party_des   <<  addr
  end

  address = row.css('td:nth-of-type(2),td:nth-of-type(4)')
  address.each do |node|
    addr = node.text.strip.gsub("\n", '').gsub("\t", '')
    parts = addr.split(',')
    addr = ("#{parts[0]}, #{parts[1]}" if parts.length == 2)
    @party_des << addr
  end
end
@party_names.compact!
@party_names.reject(&:empty?)
@party_types.compact!
@party_des.compact!        
@party_names_and_types = @party_names.zip(@party_types).map { |name, type| { part_name: name, party_type: type } }

我目前的输出是这样的

{:part_name=>"SMALL,  DANIEL", :party_type=>"Appellant  &nbsp"}
{:part_name=>"KELLY,  MARK EDWARD", :party_type=>"Attorney for Appellant"}
{:part_name=>"PITTMAN,  KRISTI LANAE", :party_type=>"Co-Counsel for Appellant"}
{:part_name=>"RED SIMPSON,  INC.", :party_type=>"Respondent   "}
{:part_name=>"GREENWALD,  DOUGLASMARK", :party_type=>"Attorney for Respondent"}
{:part_name=>"BENJAMIN,  SAMANTHA NICOLE", :party_type=>"Co-Counsel for Respondent"}

我如何获得聚会地址,但如何将其与@party_names_and_types所以我有这样的输出

{:part_name=>"SMALL,  DANIEL", :party_type=>"Appellant  &nbsp"}
{:part_name=>"KELLY,  MARK EDWARD", :party_type=>"Attorney for Appellant", :party_address => "134 N WATER STREETLIBERTY,MO 64068"}
{:part_name=>"PITTMAN,  KRISTI LANAE", :party_type=>"Co-Counsel for Appellant",:party_address => "134 N WATER STREETLIBERTY,MO 64068"}
{:part_name=>"RED SIMPSON,  INC.", :party_type=>"Respondent  "}
{:part_name=>"GREENWALD,  DOUGLASMARK", :party_type=>"Attorney for Respondent", :party_address => " 10 EAST CAMBRIDGE CIRCLE DRIVE KANSAS CITY,KS 66103"}
{:part_name=>"BENJAMIN,  SAMANTHA NICOLE", :party_type=>"Co-Counsel for Respondent", :party_address => "    MCANANY VAN CLEVE AND PHILLIPS  10 E CAMBRIDGE CIRCLE DR STE 300 KANSAS CITY,KS 66103", :party_des => "Business:(913) 573-3319"}


                                                    

【问题讨论】:

    标签: ruby parsing web-scraping nokogiri


    【解决方案1】:

    你说的表结构“有点不寻常”是对的。 你实现的逻辑,我不会说它是错的,但对于这个表,我不会去用它,因为关联的值(如派对名称和派对地址)在不同的行中。

    这是我为获得您提到的预期输出而编写的代码

    require 'nokogiri'
    
    # html = 'your provided html code...'
    
    doc = Nokogiri::HTML(html)
    rows = doc.xpath("//table[@class='detailRecordTable']//tr")
    
    @party_names_and_types = []
    
    start = 0
    step  = 5
    
    def format_text(text)
      text.strip.gsub("  ", "").gsub("
    ", ' ').gsub("	", '')
    end
    
    def get_party_name_and_type(text)
      parts = text.split(',')
      name = parts.length == 3 ? "#{parts[0]}, #{parts[1]}" : parts[0]
      party_type = format_text(parts[-1].strip) if parts && parts.length >= 2
      { party_name: name, party_type: party_type }
    end
    
    while start < rows.count
      data_rows = rows.slice(start, step)
      [0, 3].each do |row_num|
        if row_num == 0
          [1, 3].each do |col_num|
            party_details = get_party_name_and_type(
              format_text(data_rows[row_num].children.filter("td")[col_num].text)
            )
            address = data_rows[row_num+1].children.filter("td")[3].text if col_num == 3
            party_details[:party_address] = format_text(address) unless address.nil? || address.empty?
            @party_names_and_types << party_details
          end
        else
          party_details = get_party_name_and_type(
            format_text(data_rows[3].children.filter("td")[3].text)
          )
          address = data_rows[row_num+1].children.filter("td")[3].text
          party_details[:party_address] = format_text(address) unless address.nil? || address.empty?
          @party_names_and_types << party_details
        end
      end
      start += step
    end
    
    puts "======@party_names_and_types======"
    puts @party_names_and_types
    
    

    输出:

    ======@party_names_and_types======
    {:party_name=>"SMALL ,  DANIEL", :party_type=>"Appellant  &nbsp"}
    {:party_name=>"KELLY ,  MARK EDWARD ", :party_type=>"Attorney for Appellant", :party_address=>"134 N WATER STREETLIBERTY, MO 64068"}
    {:party_name=>"PITTMAN ,  KRISTI LANAE ", :party_type=>"Co-Counsel for Appellant", :party_address=>"134 NORTH WATER STREETLIBERTY, MO 64068"}
    {:party_name=>"RED SIMPSON,  INC. ", :party_type=>"Respondent   "}
    {:party_name=>"GREENWALD ,  DOUGLAS MARK ", :party_type=>"Attorney for Respondent", :party_address=>"10 EAST CAMBRIDGE CIRCLE DRIVEKANSAS CITY, KS 66103"}
    {:party_name=>"BENJAMIN,  SAMANTHA NICOLE ", :party_type=>"Co-Counsel for Respondent", :party_address=>"MCANANY VAN CLEVE AND PHILLIPS10 E CAMBRIDGE CIRCLE DRSTE 300KANSAS CITY, KS 66103  Business:(913) 573-3319"}
    

    我会在一段时间内更新答案以解释逻辑。
    希望这可以帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 2012-01-14
      • 2012-09-28
      • 2020-09-25
      • 2017-09-26
      相关资源
      最近更新 更多