2017-03-31 11 views
0

私は非常にPythonに慣れていて、ローカルファイルをスクラップするために2週間、次のコードで最初から作業しています。おそらく、私はPython、バージョン管理、lxml、bs4、リクエスト、urllib、os、globなどのパッケージをインポートしながら、ほぼ100時間も学習します。ローカルHTMLファイルのスクラップUrllibとBeautifulSoup

奇妙な名前のHTMLファイルをすべて1つのディレクトリに保存して、BeautifulSoupを読み込んで解析するのは、最初の段階で絶え間なく取り残されています。私はこのデータをすべてCSVファイルに入れたいのですが、出力するだけでクリップボードを使ってファイルにコピーすることができます。

import bs4 
from urllib.request import urlopen as uReq 
from bs4 import BeautifulSoup as soup 

#THIS LOCAL FILE WORKS PERFECTLY. I HAVE 12,000 HTML FILES IN THIS DIRECTORY TO PROCESS. HOW? 
#my_url = 'file://127.0.0.1/C:\\My Web Sites\\BioFachURLS\\www.organic-bio.com\\en\\company\\1-SUNRISE-FARMS.html' 
my_url = 'http://www.organic-bio.com/en/company/23694-MARTHOMI-ALLERGY-FREE-FOODS-GMBH' 

uClient = uReq(my_url) 
page_html = uClient.read() 
uClient.close() 

# html parsing 
page_soup = soup(page_html, "html.parser") 

# grabs each field 
contactname = page_soup.findAll("td", {"itemprop": "name"}) 
contactstreetaddress = page_soup.findAll("td", {"itemprop": "streetAddress"}) 
contactpostalcode = page_soup.findAll("td", {"itemprop": "postalCode"}) 
contactaddressregion = page_soup.findAll("td", {"itemprop": "addressRegion"}) 
contactaddresscountry = page_soup.findAll("td", {"itemprop": "addressCountry"}) 
contactfax = page_soup.findAll("td", {"itemprop": "faxNumber"}) 
contactemail = page_soup.findAll("td", {"itemprop": "email"}) 
contactphone = page_soup.findAll("td", {"itemprop": "telephone"}) 
contacturl = page_soup.findAll("a", {"itemprop": "url"}) 

#Outputs as text without tags 
Company = contactname[0].text 
Address = contactstreetaddress[0].text 
Zip = contactpostalcode[0].text 
Region = contactaddressregion[0].text 
Country = contactaddresscountry[0].text 
Fax = contactfax[0].text 
Email = contactemail[0].text 
Phone = contactphone[0].text 
URL = contacturl[0].text 

#Prints with comma delimiters 

print(Company + ', ' + Address + ', ' + Zip + ', ' + Region + ', ' + Country + ', ' + Fax + ', ' + Email + ', ' + URL) 
+0

ようこそスタックオーバーフロー!あなたは[良い質問をする方法](http://stackoverflow.com/help/how-to-ask)を学んで[最小、完全、および検証可能]を作成することができます(http://stackoverflow.com/help/ mcve)の例です。そうすれば、私たちがあなたを助けやすくなります。 –

答えて

0

私はこれまでファイルの束でフォルダを実行していましたので、少し助けてください。

我々はフォルダからファイルへのforループを開始します

import os 
from bs4 import BeautifulSoup as soup 
phone = [] # A list to store all the phone 
path = 'yourpath' # This is your folder name which stores all your html 
#be careful that you might need to put a full path such as C:\Users\Niche\Desktop\htmlfolder 
for filename in os.listdir(path): #Read files from your path 
    #Here we are trying to find the full pathname 
    for x in filename: #We will have A-H stored as path 
      subpath = os.path.join(path, filename) 
      for filename in os.listdir(subpath): 
      #Getting the full path of a particular html file 
       fullpath = os.path.join(subpath, filename) 
       #If we have html tag, then read it 
       if fullpath.endswith('.html'): continue 
       #Then we will run beautifulsoup to extract the contents 
        soup = BeautifulSoup(open(fullpath), 'html.parser') 
        #Then run your code 
        # grabs each field 
        contactname = page_soup.findAll("td", {"itemprop": "name"}) 
        contactstreetaddress = page_soup.findAll("td", {"itemprop": "streetAddress"}) 
        contactpostalcode = page_soup.findAll("td", {"itemprop": "postalCode"}) 
        contactaddressregion = page_soup.findAll("td", {"itemprop": "addressRegion"}) 
        contactaddresscountry = page_soup.findAll("td", {"itemprop": "addressCountry"}) 
        contactfax = page_soup.findAll("td", {"itemprop": "faxNumber"}) 
        contactemail = page_soup.findAll("td", {"itemprop": "email"}) 
        contactphone = page_soup.findAll("td", {"itemprop": "telephone"}) 
        contacturl = page_soup.findAll("a", {"itemprop": "url"}) 

        #Outputs as text without tags 
        Company = contactname[0].text 
        Address = contactstreetaddress[0].text 
        Zip = contactpostalcode[0].text 
        Region = contactaddressregion[0].text 
        Country = contactaddresscountry[0].text 
        Fax = contactfax[0].text 
        Email = contactemail[0].text 
        Phone = contactphone[0].text 
        URL = contacturl[0].text 
        #Here you might want to consider using dictionary or a list 
        #For example append Phone to list call phone 
        phone.append(Phone) 

コードは少し厄介ですが、それはすべての可能なフォルダを走った(でも、あなたのメインフォルダ内の他のフォルダを持っている)を探してみてくださいHTMLタグは、それを開きます。

会社のdicitonaryをキーとして使用することをお勧めします。私は会社の名前が違うと推測します。あなたの価値がそれに応じてソートされるので、リストの束も素晴らしいでしょう。私は辞書でうまくいきませんので、これ以上あなたに助言することはできません。あなたの質問にお答えしたいと思います。

P.S申し訳ありませんがコードが乱雑です。

編集:lxmlをhtml.parserに置き換えます。

+0

ありがとうございました。私は今あなたが送ったコードを見るつもりです。私はこの問題にとても苛立ちましたが、頑固で、助けを求めたくありませんでした。あなたは聖人です。どうもありがとうございます! – Hierge

関連する問題