Python Beautifulsoup:在特定字符串后查找元素

Python Beautifulsoup:在特定字符串后查找元素,python,beautifulsoup,find,Python,Beautifulsoup,Find,我有以下html代码: <div class="xyOfqd"> <div class="aAAD"> <div class="Bgbcca">Updated</div> <span class="hthtb"> <div> <span class="hthtb">September 30, 2018</span> </div>

我有以下html代码:

<div class="xyOfqd">
<div class="aAAD">
   <div class="Bgbcca">Updated</div>
   <span class="hthtb">
      <div>
         <span class="hthtb">September 30, 2018</span>
      </div>
   </span>
</div>
<div class="aAAD">
   <div class="Bgbcca">Text1</div>
   <span class="hthtb">
      <div><span class="hthtb">Text2</span></div>
   </span>
</div>
<div 
   class="aAAD">
   <div class="Bgbcca">MyText</div>
   <span class="hthtb">
      <div> 
         <span class="hthtb">Text3</span>
      </div>
   </span>
</div>
<div class="aAAD">
   <div class="Bgbcca">Text4</div>
   <span class="hthtb">
      <div><span 
         class="hthtb">Text5</span></div>
   </span>
</div>
<div class="aAAD">
   <div 
      class="Bgbcca">Text6</div>
   <span class="hthtb">
      <div><span 
         class="hthtb">Text7</span></div>
   </span>
</div>
<div class="aAAD">
<div 
   class="Bgbcca">
   Text8/div>
   <span class="hthtb">
      <div>
         <span class="hthtb">
            <div>Text9</div>
            <div><a href="https://google.com">Text10</a></div>
         </span>
      </div>
   </span>
</div>
<div class="aAAD">
   <div 
      class="Bgbcca">Text11</div>
   <span class="hthtb">
      <div><span class="hthtb">Text12</span></div>
   </span>
</div>

更新
2018年9月30日
文本1
文本2
我的文本
文本3
文本4
文本5
文本6
文本7
Text8/div>
文本9
文本11
文本12

如何找到
Text3
,它位于
div
元素后面,字符串为
MyText

只有当您的结构是最后一个结构时,您才能使用正确的值执行此操作:

from bs4 import BeautifulSoup as bfs

 html = """<div class="xyOfqd">
   <div class="aAAD">
    <div class="Bgbcca">Updated</div>
      <span class="hthtb">
      <div>
         <span class="hthtb">September 30, 2018</span>
      </div>
   </span>
</div>
<div class="aAAD">
   <div class="Bgbcca">Text1</div>
   <span class="hthtb">
      <div><span class="hthtb">Text2</span></div>
   </span>
</div>
<div 
   class="aAAD">
   <div class="Bgbcca">MyText</div>
   <span class="hthtb">
      <div> 
         <span class="hthtb">Text3</span>
      </div>
   </span>
</div>
<div class="aAAD">
   <div class="Bgbcca">Text4</div>
   <span class="hthtb">
      <div><span 
         class="hthtb">Text5</span></div>
   </span>
</div>
<div class="aAAD">
   <div 
      class="Bgbcca">Text6</div>
   <span class="hthtb">
      <div><span 
         class="hthtb">Text7</span></div>
   </span>
</div>
<div class="aAAD">
<div 
   class="Bgbcca">
   Text8/div>
   <span class="hthtb">
      <div>
         <span class="hthtb">
            <div>Text9</div>
            <div><a href="https://google.com">Text10</a></div>
         </span>
      </div>
   </span>
</div>
<div class="aAAD">
   <div 
      class="Bgbcca">Text11</div>
   <span class="hthtb">
      <div><span class="hthtb">Text12</span></div>
   </span>
</div>"""


soup = bfs(html, 'html.parser')

result = ''

for div0 in soup.find_all('div',{'class':'aAAD'}):
    for div1 in div0.find_all('div', {'class':'Bgbcca'}):
        if div1.get_text() == 'MyText':
            span = div0.find('span',{'class':'hthtb'})
            if span:
                span_to_return = span.find('span',{'class':'hthtb'})
                if span_to_return:
                    result = span_to_return.get_text()

print(result)
从bs4导入BeautifulSoup作为bfs
html=”“”
更新
2018年9月30日
文本1
文本2
我的文本
文本3
文本4
文本5
文本6
文本7
Text8/div>
文本9
文本11
文本12
"""
soup=bfs(html,'html.parser')
结果=“”
对于汤中的div0.find_all('div',{'class':'aAAD'}):
对于div0.find_all('div',{'class':'Bgbcca')中的div1:
如果div1.get_text()=“MyText”:
span=div0.find('span',{'class':'hthtb'})
如果跨度:
span_to_return=span.find('span',{'class':'hthtb'})
如果span\u到span\u返回:
result=span\u to\u return.get\u text()
打印(结果)
您可以使用以下解决方案:

from lxml import html

source = """
<div class="xyOfqd">
<div class="aAAD">
   <div class="Bgbcca">Updated</div>
   ...
   <span class="hthtb">
      <div><span class="hthtb">Text12</span></div>
   </span>
</div>"""

tree = html.fromstring(source)
print(tree.xpath('//div[.="MyText"]/following-sibling::span/div/span/text()'))
从lxml导入html
来源=”“
更新
...
文本12
"""
tree=html.fromstring(源)
打印(tree.xpath('//div[.=“MyText”]/以下同级::span/div/span/text()'))

您可以构建一个自定义查询函数来传递到
find()

并将函数包装在
find()
中,如下所示:

def has_my_text(tag, text):
    found = tag.select_one('.Bgbcca')
    if found:
        return found.get_text() == text
txt = "MyText"
soup.find(lambda tag: has_my_text(tag, txt))

你是怎么尝试的?显示您的代码。您是否只需要bs4解决方案?我正在尝试使用bs.find_all(),但我不知道将什么作为参数传递给函数。我更喜欢使用bs4,但如果有其他简单的解决方案也可以。
txt = "MyText"
soup.find(lambda tag: has_my_text(tag, txt))