从 beautifulsoup 元素中提取原始字符串位置
Posted
技术标签:
【中文标题】从 beautifulsoup 元素中提取原始字符串位置【英文标题】:Extract original string position from beautifulsoup element 【发布时间】:2018-06-22 04:14:56 【问题描述】:当使用beautifulsoup 解析长而复杂的 html 文档时,获取原始字符串中匹配元素的确切位置有时会很有用。我不能简单地搜索字符串,因为可能有多个匹配元素,我会失去 bs4 解析 DOM 的能力。鉴于这个最小的工作示例:
import bs4
html = "<div><b>Hello</b> <i>World</i></div>"
soup = bs4.BeautifulSoup(html,'lxml')
# Returns 22
print html.find("World")
# How to get this to return 22?
print soup.find("i", text="World")
如何让bs4
提取的元素返回22?
【问题讨论】:
可能感兴趣:Get position/line number - Implemented?,以及 SO Q&A Obtaining position info when parsing HTML in Python 【参考方案1】:我了解您的问题是“世界”可能被多次写入,但您想获得特定事件的位置(您不知何故知道如何识别)。
您可以使用此解决方法。我敢打赌有更优雅的解决方案,但这应该可以:
鉴于此 html:
import bs4
html = """<div><b>Hello</b> <i>World</i></div>
<div><b>Hello</b> <i>Foo World</i></div>
<div><b>Hello</b> <i>Bar World</i></div>"""
soup = bs4.BeautifulSoup(html,'lxml')
如果我们想获得Foo World出现的位置,我们可以:
-
获取标签
引入一些我们知道它在 html 的其余部分中不存在的唯一字符串
获取我们添加的字符串的位置
import bs4
html = """<div><b>Hello</b> <i>World</i></div>
<div><b>Hello</b> <i>Foo World</i></div>
<div><b>Hello</b> <i>Bar World</i></div>"""
soup = bs4.BeautifulSoup(html,'html.parser')
#1
desired_tag = soup.find("i", text="Foo World")
#2
desired_tag.insert(0, "some_unique_string")
print(str(soup))
"""
Will show:
<div><b>Hello</b> <i>World</i></div>
<div><b>Hello</b> <i>some_unique_stringFoo World</i></div>
<div><b>Hello</b> <i>Bar World</i></div>
"""
#3
print(str(soup).find("some_unique_string"))
"""
58
"""
【讨论】:
以上是关于从 beautifulsoup 元素中提取原始字符串位置的主要内容,如果未能解决你的问题,请参考以下文章
Python BeautifulSoup 提取元素之间的文本