从 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 提取元素之间的文本

只从这个元素中提取文本,而不是它的子元素

BeautifulSoup 提取节点的 XPATH 或 CSS 路径

从原始字符串中提取月份名称?

爬虫—— BeautifulSoup模块获取元素

从BeautifulSoup对象中删除非BMP字符