2011-01-15 18 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()") 

これは、(あなたはそれが完了見たい場合はclick hereを)失敗したサイトの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            
+0

名前空間宣言を確認しましたか? –

+0

@Alejandro:申し訳ありませんが、あなたは何を意味するのか分かりません。 – mfalcon

+0

これはXPathの質問ではありません。 XPath式は、整形式のXML文書(または最悪の場合はフラグメント)にのみ適用できます。テキストにリンクされたものは整形式のXMLではありません。 –

答えて

1

http://www.whfoods.com/genpage.php?tname=foodspice&dbid=97に向けたときにvalidator.w3.orgによると:

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のは気にしません)。

関連する問題