LINUX.ORG.RU

Использование правила в BeatifulfulSoup полученного из configparser

 , ,


0

1

У меня возникает проблема при передачи параметра ,полученного из конфиг. файла, т.к. он приходит ,как строка.

@property
def get_rule(self):
    config = configparser.ConfigParser()
    config.read(path)
    title_rule = config.get(self.site_name, "title")
    return title_rule


print(self.get_rule)
'h1', {'class': 'title'}


[pravda.ru]
title = 'h1', {'class': 'title'}



Пытаюсь передать в BeatifulfulSoup:

print(self.get_page.find(self.get_rule))
None

Но если я передаю:

print(self.get_page.find('h1', {'class': 'title'}))
<h1 class="title">text</h1>
или
rule = 'h1', {'class': 'title'}
print(self.get_page.find(rule))
<h1 class="title">text</h1>
То все работает правильно!

Проблема возникает только если передавать список или использовать значение полученное из конфига:

rule = "'h1', {'class': 'title'}"
print(self.get_page.find(rule))
None

Подскажите ,как правильно получить значение из конфига , чтобы beautifullsoup его нормально принял?

Для того, чтобы строку превратить в питоновский объект, её нужно явно распарсить. Можно делать вручную, если формат известен и определён, можно вызывать eval(), если формат в синтаксисе питона (очень небезопасно).

А можно использовать CSS Selector: h1.title Такую строку можно передавать из configparser в soup.select() вообще без обработки.

E ★★★ ()
Последнее исправление: E (всего исправлений: 1)
Ответ на: комментарий от E

Пожалуйста расскажите по подробнее. Я конфиг изменил на :

[name_news] title = h1.title

Но это не правильно,наверно, т.к. не сработало.

PavelShturm ()
Ответ на: комментарий от PavelShturm

Вместо soup.find() теперь нужно использовать soup.select().

import bs4

text = """<html>
<body>
<h1 class="title">Title</h1>
<h1 class="title">Another title</h1>
</body>
</html>
"""

soup = bs4.BeautifulSoup(text, 'lxml')
print(soup.select('h1.title'))
$ python test.py
[<h1 class="title">Title</h1>, <h1 class="title">Another title</h1>]
E ★★★ ()
Последнее исправление: E (всего исправлений: 1)
Ответ на: комментарий от E

Спасибо! с классом заработало.

title = 'h1', {'itemprop': 'headline'}

text = 'div', {'itemprop': 'articleBody'}

Такие элементы можно переделать в h1.headline div.articleBody?

Или он только с классами работает?

PavelShturm ()
Ответ на: комментарий от PavelShturm

Синтаксис с точкой - только с классами. Для нестандартного атрибута есть синтаксис h1[itemprop='headline']:

import bs4

text = """<html>
<body>
<h1 itemprop="headline">Title</h1>
<h1 class="title">Another title</h1>
</body>
</html>
"""

soup = bs4.BeautifulSoup(text, 'lxml')
print(soup.select("h1[itemprop='headline']"))

$ python test.py 
[<h1 itemprop="headline">Title</h1>]

Вот здесь есть обзор разных селекторов: https://www.w3schools.com/cssref/css_selectors.asp

E ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.