Как получить начальную конечную позицию ссылки в HTML - PullRequest
0 голосов
/ 04 октября 2019

У меня есть следующий текст в формате HTML.

b'<p><b>Anna Katharina Schaffelhuber</b> (* <a href="/wiki/26._Januar" title="26. Januar">26. Januar</a> <a href="/wiki/1993" title="1993">1993</a> in <a href="/wiki/Regensburg" title="Regensburg">Regensburg</a>) ist eine deutsche <a href="/wiki/Monoskibob" title="Monoskibob">Monoskibobfahrerin</a>. Sie gehört seit April 2017 dem <a href="/wiki/Bundeszollverwaltung#Spitzensportf%C3%B6rderung" title="Bundeszollverwaltung">Zoll-Ski-Team</a> an.<sup class="reference" id="cite_ref-1"><a href="#cite_note-1">[3]</a></sup>\n</p>\n'

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

text = format(BeautifulSoup(p,'html.parser').get_text())

возвращает

'Anna Katharina Schaffelhuber (* 26. Januar 1993 in Regensburg) ist eine deutsche Monoskibobfahrerin. Sie gehört seit April 2017 dem Zoll-Ski-Team an.'

, где format() - это созданная мной функция, которая удаляет нежелательные части (индексы, разрывы строк и т. Д.). Это работает в 99,9% случаев. Все идет нормально. Мой следующий шаг - извлечение ссылок.

Мой желаемый вывод выглядит примерно так:

hyperlinks : [{    "id : 0,
                "name" : "26. Januar",
                "link" : "/wiki/26._Januar",
               "start" : 32,
               "end"   : 42 },
               { ... for all the links ... }]

Я думал о разборе необработанного HTML и удалении всех <b> с, <\b> с, </a> с и т. Д. Это кажется очень раздражающим, и я не уверен, смогу ли я поймать все случаи с помощью этого метода.

Я не могу обернуть голову вокруг плавного подхода. Как я могу извлечь start, end и link для каждой гиперссылки с информацией выше?

Возможный дубликат Невозможно получить правильную ссылку в BeautifulSoup

find() и find_all() методы не решают проблему для меня. Да, find_all() вернет список всех hrefs, но мне нужна точная позиция для этого href. Я не могу просто использовать элемент в списке, сопоставить его с текстом и выяснить положение таким образом. Это может быть что-нибудь простое, например «Apple», которое может быть в тексте несколько раз. Но я хочу единственно правильную позицию. Мне нужна должность, потому что я хочу структурировать весь контент Википедии в большую базу данных. Эти гиперссылки - это информация, которую я буду использовать позже. Они помогут мне построить огромный график или сеть из Википедии.

На всякий случай, если кто-то ссылается на дампы вики: они не содержат информации о ссылках и категориях. Кроме того, обработка этих свалок кажется мне очень неудобной и нестабильной, так как обслуживание было прекращено в середине 2000-х годов.

1 Ответ

1 голос
/ 05 октября 2019

Следующее должно делать то, что вы хотите. Я предполагаю, что id - это просто уникальное значение, которое увеличивается на 1, так как вы не указали, что имел в виду какой-либо из ваших ключей.

from bs4 import BeautifulSoup

html = '<p><b>Anna Katharina Schaffelhuber</b> (* <a href="/wiki/26._Januar" title="26. Januar">26. Januar</a> <a href="/wiki/1993" title="1993">1993</a> in <a href="/wiki/Regensburg" title="Regensburg">Regensburg</a>) ist eine deutsche <a href="/wiki/Monoskibob" title="Monoskibob">Monoskibobfahrerin</a>. Sie gehört seit April 2017 dem <a href="/wiki/Bundeszollverwaltung#Spitzensportf%C3%B6rderung" title="Bundeszollverwaltung">Zoll-Ski-Team</a> an.<sup class="reference" id="cite_ref-1"><a href="#cite_note-1">[3]</a></sup>\n</p>\n'
soup = BeautifulSoup(html, 'html.parser')
clean_text = 'Anna Katharina Schaffelhuber (* 26. Januar 1993 in Regensburg) ist eine deutsche Monoskibobfahrerin. Sie gehört seit April 2017 dem Zoll-Ski-Team an.'

hrefs = {href.text: href['href'] for href in soup.find_all('a')  if href.get('title')}

hyperlinks = []
for i, (href_text, href) in enumerate(hrefs.items()):
    start = clean_text.index(href_text)
    end = start + len(href_text) - 1
    hyperlinks.append({'id': i,
                       'name': href_text,
                       'link': href,
                       'start': start,
                       'end': end})

print(hyperlinks)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...