【问题标题】:How to get link start end position in html如何在html中获取链接开始结束位置
【发布时间】:2020-02-02 19:42:22
【问题描述】:

我有以下 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 并删除所有 &lt;b&gt;s、&lt;\b&gt;s、&lt;/a&gt;s 等。这似乎很烦人,我不确定我是否可以用这种方法捕获所有情况。

我无法以平稳的方式解决问题。如何为每个包含上述信息的超链接提取start、end 和link?

无法在 BeautifulSoup 中获取正确链接的可能重复

find() 和 find_all() 方法并不能解决我的问题。是的,find_all() 将返回所有href 的列表,但我需要这个href 的确切位置。我不能只使用列表中的一个元素,将它与文本匹配并以这种方式找出位置。它可以是任何简单的东西,比如“Apple”,它可以在文本中多次出现。但我想要一个正确的位置。我需要这个职位,因为我想将维基百科的所有内容构建到一个大型数据库中。这些超链接是我稍后将使用的信息。他们将帮助我建立一个巨大的维基百科图表或网络。

以防万一有人引用 wiki 转储:它们不包含链接和类别信息。此外,由于在 2000 年代中期停止了维护,因此处理这些垃圾场对我来说似乎非常不舒服和不稳定。

【问题讨论】:

  • 不要认为find_all() 方法会有多大帮助,我需要确切的位置,find_all() 只返回所有href 的列表。但它们可能在任何地方。
  • *"超链接是信息":所以您需要超链接值,而不是html 页面内的位置索引。
  • 看看我的 JSON 示例。我需要这些信息(我在 JSON 中将其称为 link),但最重要的是我需要其中的 start 和 end。我的问题有那么暧昧吗??我很困惑。
  • “我的问题有那么含糊吗?”:是的,但为了让你满意,请阅读finding-all-adverbs-and-their-positions

标签: python html regex web-scraping beautifulsoup


【解决方案1】:

以下应该做你想做的事。我假设 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)

【讨论】:

  • 如果我提前 2 天研究这个问题,你会为我节省很多时间。我用你的简单解决方案替换了我的复杂解决方案。谢谢@LuckyZackary。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多