2010-05-22 4 views
2

Я пытаюсь построить парсер и сохранить результаты в виде файла XML, но у меня есть проблемы ..Python регулярное выражение в списке

вы бы специалисты, пожалуйста, посмотрите на мой код?

Traceback: TypeError: expected string or buffer

import urllib2, re 
from xml.dom.minidom import Document 
from BeautifulSoup import BeautifulSoup as bs 
osc = open('OSCTEST.html','r') 
oscread = osc.read() 
soup=bs(oscread) 
doc = Document() 
root = doc.createElement('root') 
doc.appendChild(root) 
countries = doc.createElement('countries') 
root.appendChild(countries) 
findtags1 = re.compile ('<h1 class="title metadata_title content_perceived_text(.*?)`</h1>', re.DOTALL | re.IGNORECASE).findall(soup) 
findtags2 = re.compile ('<span class="content_text">(.*?)</span>', re.DOTALL | re.IGNORECASE).findall(soup) 
for header in findtags1: 
title_elem = doc.createElement('title') 
countries.appendChild(title_elem) 
header_elem = doc.createTextNode(header) 
title_elem.appendChild(header_elem) 
for item in findtags2: 
    art_elem = doc.createElement('artikel') 
    countries.appendChild(art_elem) 
    s = item.replace('<P>','') 
    t = s.replace('</P>','') 
    text_elem = doc.createTextNode(t) 
    art_elem.appendChild(text_elem)  

print doc.toprettyxml() 
+0

Hi Peter; добро пожаловать в SO. Выделите код и нажмите ctrl-k, чтобы он был правильно отформатирован. Я попытался удалить некоторые пробелы, надеясь сохранить код. Если я ошибаюсь, откажитесь. – bernie

+0

Также, пожалуйста, отправьте трассировку, если сможете; который покажет линию, в которой происходит ошибка. Благодарю. – bernie

+0

Я предполагаю, что ошибка здесь: 're.compile ('....'). Findall (soup)' –

ответ

5

Это хорошо, что вы пытаетесь с помощью BeautifulSoup для разбора HTML, но это не будет работать:

re.compile('<h1 class="title metadata_title content_perceived_text(.*?)`</h1>', 
      re.DOTALL | re.IGNORECASE).findall(soup) 

Вы пытаетесь разобрать объект BeautifulSoup используя регулярное выражение. Вместо этого вы должны использовать метод FindAll на суп, как это:

regex = re.compile('^title metadata_title content_perceived_text', re.IGNORECASE) 
for tag in soup.findAll('h1', attrs = { 'class' : regex }): 
    print tag.contents 

Если вы на самом деле хотите, чтобы разобрать документ в виде текста с помощью регулярного выражения, то не использовать BeautifulSoup - только чтение документа в строка и разбор. Но я бы посоветовал вам потратить время, чтобы узнать, как работает BeautifulSoup, так как это предпочтительный способ сделать это. Дополнительную информацию см. В разделе documentation.

+0

ах да НО это не найдет остальных .. У меня настоящие проблемы получая BS, чтобы найти содержимое из тегов. –

+0

@Peter Nielsen: Можете ли вы объяснить, что вы подразумеваете под словом «он не найдет остальных»? Мое обновление отвечает на ваш вопрос? –

+0

Ну, используя bs, а не регулярное выражение, возникает проблема с тем, как я нахожу содержимое внутри тегов, а не только весь тег + контент. Ty для ответа так быстро, кстати :-) –

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