Не удается разобрать дочерний элемент таблицы с помощью xpath - PullRequest
0 голосов
/ 16 января 2011

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

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-фрагмент сайта, который не работает ( нажмите здесь , если вы хотите, чтобы он был завершен):

<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                                              

1 Ответ

1 голос
/ 16 января 2011

В соответствии с 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 не волнует).

...