【问题标题】:Extract original string position from beautifulsoup element从 beautifulsoup 元素中提取原始字符串位置
【发布时间】: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?

【问题讨论】:

标签: python html beautifulsoup


【解决方案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出现的位置,我们可以:

  1. 获取标签
  2. 引入一些我们知道它在 html 的其余部分中不存在的唯一字符串
  3. 获取我们添加的字符串的位置

    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
    """
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2014-10-09
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多