2017-05-11 3 views
0

問題:私はこのような表形式のテキストのファイルをHTMLコードを解析し、取得したいPythonの:パースhtmlと表形式のテキストファイルを作成

East Counties 
Babergh, http://ratings.food.gov.uk/OpenDataFiles/FHRS297en-GB.xml, 876 
Basildon, http://ratings.food.gov.uk/OpenDataFiles/FHRS109en-GB.xml, 1134 
... 
... 

私が代わりに何を得る: のみがtxtファイルに表示されるため、forループは新しい領域をそれぞれ印刷できません。試行コードはhtmlコードの後です。

HTMLコード: のコードは、これは上記の表を参照の抜粋となっている、this html pageで見つけることができます:

<h2> 
            East Counties</h2> 

             <table> 
              <thead> 
               <tr> 
                <th> 
                 <span id="listRegions_lvFiles_0_titleLAName_0">Local authority</span> 
                </th> 
                <th> 
                 <span id="listRegions_lvFiles_0_titleUpdate_0">Last update</span> 
                </th> 
                <th> 
                 <span id="listRegions_lvFiles_0_titleEstablishments_0">Number of businesses</span> 
                </th> 
                <th> 
                 <span id="listRegions_lvFiles_0_titleCulture_0">Download</span> 
                </th> 
               </tr> 
              </thead> 

             <tr> 
              <td> 
               <span id="listRegions_lvFiles_0_laNameLabel_0">Babergh</span> 
              </td> 
              <td> 
               <span id="listRegions_lvFiles_0_updatedLabel_0">04/05/2017 </span> 
               at 
               <span id="listRegions_lvFiles_0_updatedTime_0"> 12:00</span> 
              </td> 
              <td> 
               <span id="listRegions_lvFiles_0_establishmentsLabel_0">876</span> 
              </td> 
              <td> 
               <a id="listRegions_lvFiles_0_fileURLLabel_0" title="Babergh: English language" href="http://ratings.food.gov.uk/OpenDataFiles/FHRS297en-GB.xml">English language</a> 
              </td> 
             </tr> 

             <tr> 
              <td> 
               <span id="listRegions_lvFiles_0_laNameLabel_1">Basildon</span> 
              </td> 
              <td> 
               <span id="listRegions_lvFiles_0_updatedLabel_1">06/05/2017 </span> 
               at 
               <span id="listRegions_lvFiles_0_updatedTime_1"> 12:00</span> 
              </td> 
              <td> 
               <span id="listRegions_lvFiles_0_establishmentsLabel_1">1,134</span> 
              </td> 
              <td> 
               <a id="listRegions_lvFiles_0_fileURLLabel_1" title="Basildon: English language" href="http://ratings.food.gov.uk/OpenDataFiles/FHRS109en-GB.xml">English language</a> 
              </td> 
             </tr> 

私の試み:どのように

from xml.dom import minidom 
import urllib2 
from bs4 import BeautifulSoup 

url='http://ratings.food.gov.uk/open-data/' 
f = urllib2.urlopen(url) 
mainpage = f.read() 
soup = BeautifulSoup(mainpage, 'html.parser') 

regions=[] 
with open('Regions_and_files.txt', 'w') as f: 
    for h2 in soup.find_all('h2')[6:]: #Skip 6 h2 lines 
     region=h2.text.strip() #Get the text of each h2 without the white spaces 
     regions.append(str(region)) 
     f.write(region+'\n') 
     for tr in soup.find_all('tr')[1:]: # Skip headers 
      tds = tr.find_all('td') 
      if len(tds)==0: 
       continue 
      else: 
       a = tr.find_all('a') 
       link = str(a)[10:67] 
       span = tr.find_all('span') 
       places = int(str(span[3].text).replace(',', '')) 
       f.write("%s,%s,%s" % \ 
           (str(tds[0].text)[1:-1], link, places)+'\n') 

私はこれを修正できますか?

答えて

2

私は美しいスープライブラリに慣れていないんだけど、それはあなたが文書のすべてtr要素を横断している各h2サイクルのようなコードから判断します。代わりに、特定のh2要素に関連するテーブルに属する行だけをトラバースする必要があります。

編集: あなたがh2以来.next_siblingを使用することができるようにBeautiful Soup docsで簡単に見に見えた後は、常にtable、すなわちtable = h2.next_sibling.next_sibling(最初の兄弟は、空白を含む文字列であるため、二回と呼ばれる)が続いています。 から、すべての行をトラバースできます。

実際にが複製元に重複しているため、ウェールズの重複を取得している理由があります。

+0

'h2'の検索を' table'の中にネストしますか? – FaCoffee

+0

難局を解決しました。ありがとう、トン! – FaCoffee

関連する問題