Ruby Nokogiri Разбор HTML таблицы - PullRequest
4 голосов
/ 18 ноября 2009

Я использую mechanize / nokogiri и мне нужно разобрать следующую строку HTML. Может кто-нибудь помочь мне с синтаксисом xpath, чтобы сделать это или любые другие методы, которые будут работать?

<table>
  <tr class="darkRow">
    <td>
      <span>
        <a href="?x=mSOWNEBYee31H0eV-V6JA0ZejXANJXLsttVxillWOFoykMg5U65P4x7FtTbsosKRbbBPuYvV8nPhET7b5sFeON4aWpbD10Dq">
            <span>4242YP</span>
        </a>
      </span>
    </td>
    <td>
      <span>Subject of Meeting</span>
    </td>
    <td>
      <span>
        <span>01:00 PM</span> 
        <span>Nov 11 2009</span> 
        <span>America/New_York</span>
      </span>
    </td>
    <td>
      <span>30</span>
    </td>
    <td>
      <span>
        <span>example@email.com</span>
      </span>
    </td>
    <td>
        <span>39243368</span>
    </td>
  </tr>
  .
  .
  .
  <more table rows with the same format>
</table>

Я хочу это как вывод

"4242YP","Subject of Meeting","01:00 PM Nov 11 2009 America/New_York","30","example@email.com", "39243368"
.
.
.
<however many rows exist in the html table>

Ответы [ 2 ]

4 голосов
/ 18 ноября 2009

как то так?

items=doc.xpath('//tr').map {|row| row.xpath('.//span/text()').select{|item| item.text.match(/\w+/)}.map {|item| item.text} }

возвращается: => [["4242YP", "Тема собрания", "13:00 PM", "11 ноября 2009", "America / New_York", "30", "example@email.com", "39243368"], [ "АБВГДЕЖ"]]

Выбор включает в себя только промежутки, начинающиеся с символов слова (например, исключая пробелы, которые есть у некоторых из ваших промежутков). Возможно, вам придется усовершенствовать фильтр «select» для вашего конкретного случая.

Я добавил минималистскую строку, которая содержала span, содержащий abcdefg, чтобы вы могли видеть вложенный массив.

0 голосов
/ 18 ноября 2009

Вот часть XSL для преобразования вашего входа, если у вас есть XSL-преобразователь:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
   <xsl:apply-templates select="//tr"/>
</xsl:template>

<xsl:template match="tr">
   "<xsl:value-of select="td/span/a/span"/>","<xsl:value-of select="td[position()=2]/span"/>","<xsl:value-of select="td[position()=3]/span/span[position()=1]"/>"
</xsl:template>

</xsl:stylesheet>

Полученный результат выглядит следующим образом:

"4242YP","Subject of Meeting","01:00 PM"
"4242YP","Subject of Meeting","01:00 PM"

(я продублировал вашу первую строку таблицы).

Биты выбора XSL дают вам хорошее представление о том, какой вход XPATH вам потребуется для получения остальных.

...