【发布时间】: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 并删除所有 <b>s、<\b>s、</a>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