2012-06-30 5 views
2

Я хочу, чтобы разобрать часть HTML страницы, скажемBeautifulSoup: разобрать только часть страницы

my_string = """ 
<p>Some text. Some text. Some text. Some text. Some text. Some text. 
    <a href="#">Link1</a> 
    <a href="#">Link2</a> 
</p> 
<img src="image.png" /> 
<p>One more paragraph</p> 
""" 

Я прохожу эту строку BeautifulSoup:

soup = BeautifulSoup(my_string) 
# add rel="nofollow" to <a> tags 
# return comment to the template 

Но при разборе BeautifulSoup добавляет <html>, <head> и <body> (при использовании парсеров lxml или html5lib), и мне не нужны те, что содержатся в моем коде. Единственный способ, который я нашел до сих пор, чтобы избежать этого, - использовать html.parser.

Интересно, есть ли способ избавиться от избыточных тегов, используя lxml - самый быстрый парсер.

UPDATE

Первоначально мой вопрос был задан неправильно. Теперь я удалил обертку <div> из моего примера, поскольку обычный пользователь не использует этот тег. По этой причине мы не можем использовать метод .extract(), чтобы избавиться от <html>, <head> и <body> тегов.

+0

Вы пробовали использовать MinimalSoup вместо BeautifulSoup? (Такая же библиотека, другой конструктор). Он должен быть менее строгим в этом отношении. –

+0

Я пробовал, но я не мог понять, как это работает. –

ответ

0

я мог бы решить эту проблему, используя .contents свойство:

try: 
    children = soup.body.contents 
    string = '' 
    for child in children: 
     string += str(item) 
    return string 
except AttributeError: 
    return str(soup) 

Я думаю, что ''.join(soup.body.contents) будет более аккуратным списком для преобразования строк, но это не работает, и я получаю

TypeError: sequence item 0: expected string, Tag found

0

LXML всегда будет добавить эти теги, но вы можете использовать Tag.extract(), чтобы удалить <div> тег внутри них:

comment = soup.body.div.extract() 
1

Использование

soup.body.renderContents() 
Смежные вопросы