2011-01-15 2 views
0

Я разбираю сайт с каким-то грязным html, это 130 подсайтов, и единственный, который терпит неудачу, является последним. Часть, в которой происходит сбой, является полужирным. Я получаю пустой список, когда мне нужно получить 3 (родительский и 2 ребенка). Все сайты имеют одинаковую структуру, поэтому я не знаю, как это решить.Не удается разобрать дочерний элемент таблицы с помощью xpath

from lxml.html import parse 
# get a list of the urls of the foods to parse 
main_site = "http://www.whfoods.com/foodstoc.php" 
doc = parse(main_site).getroot() 
doc.make_links_absolute() 
sites = doc.xpath('/html/body//div[@class="full3col"]/ul/li/a/@href') 

for site in sites: 
    doc = parse(site).getroot() 
    **table = doc.xpath("descendant::table[1]")[0]** 
    #food info list 
    table.xpath("//tr/td/table/tr/td/b/text()") 
    # food nutrients list 
    table.xpath("//tr/td/table[1]/tr/td/text()") 

Это HTML фрагмент сайта, который выходит из строя (click here, если вы хотите увидеть его в комплекте):

<html> 
    <head> 
    <body> 
     <div id=mainpage"> 
      <div id="subcontent"> 
       (40+ <p> tags with things inside) 
       <p> 
        <table> 
         <tbody> 
          <tr> 
           <td> 
            <table> 
             <tbody> 
              <tr> 
               <td> 
                <b>Food's name<br>other things</b> 
               </td> 
              </tr> 
              <tr> 
              Heads of the table(not needed) 
              </tr> 
              <tr> 
               <td>nutrient name</td> 
               <td>dv</td> 
               <td>density</td> 
               <td>rating</td> 
              </tr> 
             </tbody> 
            </table> 
            <table> Not needed 
            ... 
          All remaining closing tags            
+0

Вы проверили декларацию пространства имен? –

+0

@Alejandro: Извините, я не знаю, что вы имеете в виду. – mfalcon

+0

Это * не * вопрос XPath. Выражение XPath может применяться только на хорошо сформированном XML-документе (или в фрагменте наихудшего случая). Связанный с текстом не является корректным XML. –

ответ

1

Согласно validator.w3.org, когда указал на http://www.whfoods.com/genpage.php?tname=foodspice&dbid=97:

Line 253, column 147: non SGML character number 150 

    …ed mushrooms by Liquid Chromatography Mass Spectroscopy. The 230th ACS Natio… 

Характер проблемы между «Хроматография» и «Масса». Страница объявляется быть закодирован в ISO-8859-1, но, как часто бывает в этом случае, он лжет:

>>> import unicodedata as ucd 
>>> ucd.name(chr(150).decode('cp1252')) 
'EN DASH' 

Возможно LXML будет придирчивым об этом также (Firefox не заботится).

Смежные вопросы