Красивый суп: Как извлечь данные из тегов HTML из противоречивых данных - PullRequest
0 голосов
/ 01 июля 2019

Я хотел извлечь данные из тегов, которые бывают двух видов:

<td><div><font> Something else</font></div></td>

и

<td><div><font> Something <br/>else</font></div></td>

Я использую метод .string(), где в первом случае он дает мне необходимую строку (Something else), но во втором случае он дает мне None.

Есть ли лучший или альтернативный способ сделать это?

Ответы [ 2 ]

3 голосов
/ 01 июля 2019

Попробуйте использовать свойство .text вместо .string

from bs4 import BeautifulSoup

html1 = '<td><div><font> Something else</font></div></td>'
html2 = '<td><div><font> Something <br/>else</font></div></td>'

if __name__ == '__main__':
    soup1 = BeautifulSoup(html1, 'html.parser')
    div1 = soup1.select_one('div')
    print(div1.text.strip())

    soup2 = BeautifulSoup(html2, 'html.parser')
    div2 = soup2.select_one('div')
    print(div2.text.strip())

, которое выдает:

Something else
Something else
1 голос
/ 01 июля 2019

Вы можете использовать регулярные выражения всегда для таких вещей!

import re
result = re.search('font>(.*?)</font',  str(scrapped_html))
print(result[1])

Это сработает в вашем случае.Чтобы избежать захвата тега, вам нужно манипулировать строкой.

Проверьте с помощью print("<br/>" in result[1]), содержит ли строказатем тег вернет True, в этом случае вам нужно удалить тег.

result = str(result[1]).split("<br/>") это даст вам список [' Something ', 'else'], присоединитесь к ним, чтобы получить ответ. result = (" ").join(result)

Вот полный фрагмент:

import re

result = re.search('font>(.*?)</font',  str(scrapped_html))

if "<br/>" in result[1]:
    result = str(result[1]).split("<br/>")
    result = (" ").join(result)
    print(result)
else:
    print(result[1])

Я понимаю, что это довольно плохое решение, но оно будет работать для вас!

...