Как я могу выбрать эти элементы из следующих ужасных HTML, используя xpath и lxml? - PullRequest
1 голос
/ 19 ноября 2010

Я хочу выбрать следующие строки из этого html, используя только lxml и немного умного xpath.Строки будут меняться, но окружающий HTML не будет.

мне нужно ...

  • 19/11/2010
  • AAAAAA/01
  • Normal
  • United Kingdom
  • This description may contains <bold>html</bold> but i still need all of it!

от ...

...
<p>
    <strong>Date:</strong> 19/11/2010<br>
    <strong>Ref:</strong> AAAAAA/01<br>
    <b>Type:</b> Normal<br>
    <b>Country:</b> United Kingdom<br>
</p>
<hr>
<p>
    <br>
    <b>1. Title:</b> The Title<br>
    <b>2. Description: </b> This description may contains <bold>html</bold> but i still need all of it!<br>
    <b>3. Date:</b> 25th October<br>
...

</p>

...

Пока я только подошелс использованием выражений регулярных выражений и re:match, чтобы попытаться перетащить его, но даже это не сработает без чего-либо, что позволит мне получить innerHTML для <p> узлов для примера.

есть ли способсделать это без пост-обработки строки через регулярное выражение?

Спасибо:)

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Очень некрасиво! С этим правильно сформированным вводом:

<html>
<p>
    <strong>Date:</strong> 19/11/2010<br/>
    <strong>Ref:</strong> AAAAAA/01<br/>
    <b>Type:</b> Normal<br/>
    <b>Country:</b> United Kingdom<br/>
</p>
<hr/>
<p>
    <br/>
    <b>1. Title:</b> The Title<br/>
    <b>2. Description: </b> This description may contains <bold>html</bold> but i still need all of it!<br/>
    <b>3. Date:</b> 25th October<br/>
</p>
</html>

Простейший случай:

/html/p/strong[.='Date:']/following-sibling::text()[1]

Оценить по:

 19/11/2010

Все в одном:

/html/p/*[self::strong[.='Date:' or .='Ref:']|
          self::b[.='Type:' or .='Country:']]
         /following-sibling::text()[1]

Комплекс один:

/html/p/node()[preceding-sibling::b[1][.='2. Description: ']]
              [following-sibling::b[1][.='3. Date:']]
              [not(self::br)]
0 голосов
/ 19 ноября 2010

Это не так сложно.

Учитывая этот документ XML:

<html> 
<p> 
    <strong>Date:</strong> 19/11/2010<br/> 
    <strong>Ref:</strong> AAAAAA/01<br/> 
    <b>Type:</b> Normal<br/> 
    <b>Country:</b> United Kingdom<br/> 
</p> 
<hr/> 
<p> 
    <br/> 
    <b>1. Title:</b> The Title<br/> 
    <b>2. Description: </b> This description may contains <bold>html</bold> but i still need all of it!<br/> 
    <b>3. Date:</b> 25th October<br/> 
</p> 
</html> 

Мне нужно ...

  • 19/11/2010
  • AAAAAA / 01
  • Обычный
  • Великобритания

это выражение XPathвыделяет все вышеперечисленные текстовые узлы :

/*/p[1]/text()
  • Это описание может содержать html, но мне все еще нужно все это!

Используйте это :

/*/p[2]/b[2]/following-sibling::node()
                 [count(.|/*/p[2]/b[2]/following-sibling::br[1]/preceding-sibling::node()) 
                = 
                  count((/*/p[2]/b[2]/following-sibling::br[1]/preceding-sibling::node()))
                 ]
...