Как извлечь текст внутри тега с его тегами? - PullRequest
1 голос
/ 11 октября 2019

Я хочу разобрать HTML-страницу, используя beautifulsoup. Я хочу извлечь текст внутри тега без удаления внутренних тегов HTML. например пример ввода:

<a class="fl" href="https://stackoverflow.com/questio...">
    Angular2 <b>Router link not working</b>
</a>

пример вывода:

'Angular2 <b>Router link not working</b>'

Я пробовал это:

from bs4 import Beautifulsoup
string = '<a class="fl" href="https://stackoverflow.com/questio...">
         Angular2 <b>Router link not working</b>
         </a>'
soup = Beautifulsoup(string, 'html.parser')
print(soup.text)

Но это дает:

'Angular2 Router link not working'

Как извлечь текст, не удаляя внутренние теги?

Ответы [ 3 ]

2 голосов
/ 11 октября 2019

С здесь первый ответ работает нормально. Для этого примера:

from bs4 import Beautifulsoup
string = '<a class="fl" href="https://stackoverflow.com/questio...">
             Angular2 <b>Router link not working</b>
         </a>'
soup = BeautifulSoup(string, 'html.parser')
soup.find('a').encode_contents().decode('utf-8')

Это дает:

'Angular2 <b>Router link not working</b>'
1 голос
/ 11 октября 2019

Вы извлекаете весь текст из тега 'a', включая каждый тег внутри него, когда пишете print(soup.text). Если вы хотите получить объект только тега 'b', попробуйте следующее:

soup = BeautifulSoup(string, 'html.parser')
b = soup.find('b')
print(b)
print(type(b))

или

soup = BeautifulSoup(string, 'html.parser')
b = soup.find('a', class_="fl").find('b')
print(b)
print(type(b))

Вывод:

<b>Router link not working</b>
<class 'bs4.element.Tag'>

Как вы видите, он вернет ваш тег 'b' в объекте beautifullsoup

Если вам нужны данные в строковом формате, вы можете просто написать:

b = soup.find('a', class_="fl").find('b')
b = str(b)
print(b)
print(type(b))

Вывод:

<b>Router link not working</b>
<class 'str'>
0 голосов
/ 11 октября 2019

Да, как сказал Den, вам нужно захватить этот внутренний тег, а затем сохранить его как тип str, чтобы включить этот внутренний тег. В данном решении от Den, он будет захватывать только теги <b>, а не родительский тег / текст, и нет, если там есть другие типы стилей. Но если есть другие теги, вы можете использовать более общие и найти дочерние элементы тега <a> вместо того, чтобы специально искать тег <b>.

По сути, это то, что нужно сделать, это найтитег <a> и захватите весь текст. Затем он перейдет в дочерние элементы этого тега <a>, преобразует его в строку, а затем заменит текст из этого родительского текста строкой (которая включает теги)

string = '''<a class="fl" href="https://stackoverflow.com/questio...">
     Angular2 <b>Router link not working</b> and then this is in <i>italics</i> and this is in <b>bold</b>
     </a>'''



from bs4 import BeautifulSoup, Tag

soup = BeautifulSoup(string, 'html.parser')
parsed_soup = ''

for item in soup.find_all('a'):
    if type(item) is Tag and 'a' != item.name:
        continue
    else:
        try:
            parent = item.text.strip()
            child_elements = item.findChildren()
            for child_ele in child_elements:
                child_text = child_ele.text
                child_str = str(child_ele)


                parent = parent.replace(child_text, child_str)
        except:
            parent = item.text

print (parent)

Вывод:

print (parent)
Angular2 <b>Router link not working</b> and then this is in <i>italics</i> and this is in <b>bold</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...