2013-07-10 3 views
1

Я хочу запустить скрипт python для разбора html-файлов и сбора списка всех ссылок с атрибутом target="_blank".Попытка собрать данные из локальных файлов с помощью BeautifulSoup

Я пробовал следующее, но ничего не получил от bs4. SoupStrainer говорит, что в документах он будет принимать аргументы так же, как findAll и т. Д., Если это работает? Я пропустил какую-то глупую ошибку?

import os 
import sys 

from bs4 import BeautifulSoup, SoupStrainer 
from unipath import Path 

def main(): 

    ROOT = Path(os.path.realpath(__file__)).ancestor(3) 
    src = ROOT.child("src") 
    templatedir = src.child("templates") 

    for (dirpath, dirs, files) in os.walk(templatedir): 
     for path in (Path(dirpath, f) for f in files): 
      if path.endswith(".html"): 
       for link in BeautifulSoup(path, parse_only=SoupStrainer(target="_blank")): 
        print link 

if __name__ == "__main__": 
    sys.exit(main()) 

ответ

2

Я думаю, что нужно что-то вроде этого

if path.endswith(".html"): 
    htmlfile = open(dirpath) 
    for link in BeautifulSoup(htmlfile,parse_only=SoupStrainer(target="_blank")): 
     print link 
+0

Я знал, что это будет что-то глупое, что я пропустил! Благодарю. –

2

Использование BeautifulSoup в порядке, но вы должны передать в HTML строку, а не только путь к HTML файлу. BeautifulSoup принимает строку html как аргумент, а не путь к файлу. Он не откроет его, а затем автоматически прочитает содержимое. Вы должны сделать это сами. Если вы пройдете в a.html, суп будет <html><body><p>a.html</p></body></html>. Это не содержимое файла. Конечно, ссылок нет. Вы должны использовать BeautifulSoup(open(path).read(), ...).

редактировать:
Он также принимает дескриптор файла. BeautifulSoup(open(path), ...) достаточно.

+0

Я знал, что это будет просто! Спасибо! –

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