提问人:snoozy 提问时间:2/6/2023 更新时间:2/6/2023 访问量:74
如何合并 3 个哈希?
How to merge 3 hashes?
问:
我一直在尝试从表中获取一些信息到哈希中,所以这是我有一个如下所示的 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   </td> <td width="20%" class="detailSeperator" style="width:20%;font-weight: normal"> represented by
</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"> </td>
<td width="30%" class="detailData"> </td>
<td width="20%" class="detailData"> </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"> </td>
<td width="30%" class="detailData"> </td>
<td width="20%" class="detailData"> </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%;">
</td>
<td width="30%" class="detailSeperator" style="width:30%;text-align:left">
RED SIMPSON, INC.
, Respondent
</td>
<td width="20%" class="detailSeperator" style="width:20%;font-weight: normal"> represented by
</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"> </td>
<td width="30%" class="detailData"> </td>
<td width="20%" class="detailData"> </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"> </td>
<td width="30%" class="detailData"> </td>
<td width="20%" class="detailData"> </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  "}
{: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  "}
{: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"}
答:
0赞
KunalK
2/6/2023
#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("\n", ' ').gsub("\t", '')
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  "}
{: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"}
我将在一段时间内更新答案以解释逻辑。
希望这会有所帮助。
评论