Beautifulsoup4 - Как правильно извлечь текст с помощью find ()?

Если я анализирую веб-сайт, используя BS4, и из его исходного кода я хочу напечатать текст «+26,67%»

 <font color="green"><b><nobr>+26.67%</nobr></b></font>

Я возился с командой .find_all() (http://www.crummy.com/software/BeautifulSoup/bs4/doc/) безрезультатно. Каким будет правильный способ поиска исходного кода и печати только текста?

мой код:

import requests
from bs4 import BeautifulSoup

    set_url = "*insert web address here*"
    set_response = requests.get(set_url)
    set_data = set_response.text
    soup = BeautifulSoup(set_data)
    e = soup.find("nobr")
    print(e.text)

person user3230554    schedule 13.02.2014    source источник


Ответы (4)


Небольшой пример:

>>> s="""<font color="green"><b><nobr>+26.67%</nobr></b></font>"""
>>> print s
<font color="green"><b><nobr>+26.67%</nobr></b></font>
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(s)
>>> e = soup.find("nobr")
>>> e.text #or e.get_text()
u'+26.67%'

find вернуть первый Tag, find_all вернуть ResultSet:

>>> type(e)
<class 'bs4.element.Tag'>
>>> es = soup.find_all("nobr")
>>> type(es)
<class 'bs4.element.ResultSet'>
>>> for e in es:
...     print e.get_text()
...
+26.67%

Если вы хотите указать nobr под b и font, это может быть:

>>> soup.find("font",{'color':'green'}).find("b").find("nobr").get_text()
u'+26.67%'

Непрерывный .find может вызвать исключение, если предыдущий .find возвращает None, обратите внимание.

person WKPlus    schedule 13.02.2014
comment
Это почти так же, как я использовал find_all() Я думаю, проблема в том, как анализировать веб-страницу. в вашем примере ваша настройка s = """....""" в моей программе анализирует страницу с помощью запросов. я добавлю свой код к основному вопросу, дайте мне знать, что вы думаете - person user3230554; 13.02.2014

Используйте селектор CSS:

>>> s = """<font color="green"><b><nobr>+26.67%</nobr></b></font>"""
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(s)
>>> soup.select('font[color="green"] > b > nobr')
[<nobr>+26.67%</nobr>]

Добавляйте или удаляйте имена свойств или элементов из строки селектора, чтобы сделать совпадение более или менее точным.

person phihag    schedule 13.02.2014

Вот вам мое решение

s = """<font color="green"><b><nobr>+26.67%</nobr></b></font>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(s)
a = soup.select('font')
print a[0].text
person combuilder    schedule 13.02.2014

Вы можете получить текст без использования библиотеки requests. Ниже приведено изменение, которое я внес в ваш код, и оно дало ожидаемый результат.

from bs4 import BeautifulSoup
html_snippet="""<font color="green"><b><nobr>+26.67%</nobr></b></font>"""
soup = BeautifulSoup(html_snippet)
e = soup.find("nobr")
print(e.text)

Результат был

+26.67%

Удачи!

person Steffi Keran Rani J    schedule 17.01.2021