Я пытаюсь разобрать электронные письма PayPal HTML, чтобы выбрать различные элементы. Например, в нем отображаются все купленные предметы с их ценой, единицами и суммой.
Это <table>
Я пытаюсь разобрать:
<table align="center" border="0" cellpadding="0" cellspacing="0" style="clear:both;color:#333!important;font-size:12px;font-family:arial,helvetica,sans-serif" width="598px">
<tbody>
<tr>
<td style="border:1px solid #ccc;border-right:none;border-left:none;padding:5px 10px 5px 10px!important;color:#333333" width="348" align="left">Description</td>
<td style="border:1px solid #ccc;border-right:none;border-left:none;padding:5px 10px 5px 10px!important;color:#333333" width="100" align="right">Unit price</td>
<td style="border:1px solid #ccc;border-right:none;border-left:none;padding:5px 10px 5px 10px!important;color:#333333" width="50" align="right">Qty</td>
<td style="border:1px solid #ccc;border-right:none;border-left:none;padding:5px 10px 5px 10px!important;color:#333333" width="80" align="right">Amount</td>
</tr>
<tr>
<td valign="top" align="left" style="border-bottom:none;padding:10px"><a href="http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&item=171154674852" target="_blank">FUNDA PIEL FUCSIA PARA BQ AQUARIUS 4.5. GRAN CALIDAD.</a><br>Item# 171154674852</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">€3,50 EUR</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">1</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">€3,50 EUR</td>
</tr>
<tr>
<td valign="top" align="left" style="border-bottom:none;padding:10px"><a href="http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&item=171154674852" target="_blank">FUNDA PIEL ROJA PARA IPHONE 4.5. GRAN CALIDAD.</a><br>Item# 171154674852</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">€10,50 EUR</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">1</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">€10,50 EUR</td>
</tr>
</tbody>
</table>
Я использую совпадение, чтобы обнаружить и поймать разные vars (Ruby):
unless /thePreviousRegexp/.match(body).nil?
item = /thePreviousRegexp/.match(body)[:item]
price_unit = /thePreviousRegexp/.match(body)[:price_unit]
end
Хорошо, это работает, когда у меня есть только один элемент. Но, когда у меня больше одного, он просто берет последний. Я хочу поймать всех.
Как я могу это сделать? Я положил <tr>, который принадлежит таблице среди() +, что означает, что шаблон может повторяться один или несколько раз. Но, похоже, это не работает.
Используйте Нокогири.
Я бы сделал так:
require 'nokogiri'
doc = Nokogiri::HTML.parse <<-eot
<table align="center" border="0" cellpadding="0" cellspacing="0" style="clear:both;color:#333!important;font-size:12px;font-family:arial,helvetica,sans-serif" width="598px">
<tbody>
<tr>
<td style="border:1px solid #ccc;border-right:none;border-left:none;padding:5px 10px 5px 10px!important;color:#333333" width="348" align="left">Description</td>
<td style="border:1px solid #ccc;border-right:none;border-left:none;padding:5px 10px 5px 10px!important;color:#333333" width="100" align="right">Unit price</td>
<td style="border:1px solid #ccc;border-right:none;border-left:none;padding:5px 10px 5px 10px!important;color:#333333" width="50" align="right">Qty</td>
<td style="border:1px solid #ccc;border-right:none;border-left:none;padding:5px 10px 5px 10px!important;color:#333333" width="80" align="right">Amount</td>
</tr>
<tr>
<td valign="top" align="left" style="border-bottom:none;padding:10px"><a href="http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&item=171154674852" target="_blank">FUNDA PIEL FUCSIA PARA BQ AQUARIUS 4.5. GRAN CALIDAD.</a><br>Item# 171154674852</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">€3,50 EUR</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">1</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">€3,50 EUR</td>
</tr>
<tr>
<td valign="top" align="left" style="border-bottom:none;padding:10px"><a href="http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&item=171154674852" target="_blank">FUNDA PIEL ROJA PARA IPHONE 4.5. GRAN CALIDAD.</a><br>Item# 171154674852</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">€10,50 EUR</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">1</td>
<td valign="top" align="right" style="border-bottom:none;padding:10px">€10,50 EUR</td>
</tr>
</tbody>
</table>
eot
table_header = doc.xpath("//table//tr[1]/td").map(&:text)
# => ["Description", "Unit price", "Qty", "Amount"]
product_information = doc.xpath("//table//tr[position()!=1]").map do |e|
Hash[table_header.zip(e.css('td').map(&:text))]
end
product_information
# => [{"Description"=>
# "FUNDA PIEL FUCSIA PARA BQ AQUARIUS 4.5. GRAN CALIDAD.Item# 171154674852",
# "Unit price"=>"€3,50 EUR",
# "Qty"=>"1",
# "Amount"=>"€3,50 EUR"},
# {"Description"=>
# "FUNDA PIEL ROJA PARA IPHONE 4.5. GRAN CALIDAD.Item# 171154674852",
# "Unit price"=>"€10,50 EUR",
# "Qty"=>"1",
# "Amount"=>"€10,50 EUR"}]
Вместо того, чтобы использовать match
Вам нужно использовать exec
метод и повторить его в while
цикл.
Используйте только короткое регулярное выражение:
/item=(\d*?)\".*?€([\d\,]+) EUR/g
Надеюсь, что это поможет, но не в преступной деятельности.