Python 使用bs4查找包含文本的html标记(h2)

Python 使用bs4查找包含文本的html标记(h2),python,html,beautifulsoup,html-parsing,bs4,Python,Html,Beautifulsoup,Html Parsing,Bs4,对于这部分html代码: html3= """<a name="definition"> </a> <h2><span class="sectioncount">3.342.2323</span> Content Logical Definition <a title="link to here" class="self-link" href="valueset-investigation"><img src="ta.

对于这部分html代码:

html3= """<a name="definition"> </a>
<h2><span class="sectioncount">3.342.2323</span> Content Logical Definition <a title="link to here" class="self-link" href="valueset-investigation"><img src="ta.png"/></a></h2>
<hr/>
<div><p from the following </p><ul><li>Include these codes as defined in http://snomed.info/sct<table><tr><td><b>Code</b></td><td><b>Display</b></td></tr><tr><td>34353553</td><td>Examination / signs</td><td/></tr><tr><td>35453453453</td><td>History/symptoms</td><td/></tr></table></li></ul></div>
<p> </p>"""
这是一个错误:

AttributeError: 'NoneType' object has no attribute 'nextsibilings'

文本中有几个h2,但唯一使h2唯一的字符是内容逻辑定义。在找到这个h2之后,我将从表中提取数据并在其下列出

主要问题是如何定位h2元素以从中查找同级元素。我将使用一个检查内容逻辑定义是否在文本中:

soup.find(lambda elm: elm.name == "h2" and "Content Logical Definition" in elm.text)
此外,要获得下一个兄弟姐妹,您应该使用而不是下一个兄弟姐妹

演示:


主要问题是如何定位h2元素以从中查找同级元素。我将使用一个检查内容逻辑定义是否在文本中:

soup.find(lambda elm: elm.name == "h2" and "Content Logical Definition" in elm.text)
此外,要获得下一个兄弟姐妹,您应该使用而不是下一个兄弟姐妹

演示:


试试下一个吧???试试下一个吧???谢谢!,我的主要目的是找到table和ul作为下一个兄弟姐妹。但是在h2.next_sibles中的这部分代码之后:如果您编写一个代码:if sibling.name==table:print 2作为示例,则它不会。它似乎不考虑或作为下一个兄弟姐妹。不过,如果对div有效@Mary当然可以,我想你可以这样使用find_next:table=h2.find_nexttable.非常感谢!。现在的问题是:它将在h2之后找到所有表。而我只需要在内容逻辑定义部分中定义的表。换句话说,如果内容逻辑定义中没有定义表,我希望代码表中的表=h2.find\u nexttable为空。你有什么建议?再次感谢@Mary好的,为了有一个更好的上下文,您能提供一个完整的HTML输入和所需的输出吗?谢谢@谢谢alecxe!,这是我试图提取信息的两个网页的链接。我只需要内容逻辑定义部分的信息,因此,如果此部分中没有定义表,我将为表中定义的所有字段定义null:,谢谢!,我的主要目的是找到table和ul作为下一个兄弟姐妹。但是在h2.next_sibles中的这部分代码之后:如果您编写一个代码:if sibling.name==table:print 2作为示例,则它不会。它似乎不考虑或作为下一个兄弟姐妹。不过,如果对div有效@Mary当然可以,我想你可以这样使用find_next:table=h2.find_nexttable.非常感谢!。现在的问题是:它将在h2之后找到所有表。而我只需要在内容逻辑定义部分中定义的表。换句话说,如果内容逻辑定义中没有定义表,我希望代码表中的表=h2.find\u nexttable为空。你有什么建议?再次感谢@Mary好的,为了有一个更好的上下文,您能提供一个完整的HTML输入和所需的输出吗?谢谢@谢谢alecxe!,这是我试图提取信息的两个网页的链接。我只需要内容逻辑定义部分的信息,所以如果该部分中没有定义表,我将为表中定义的所有字段定义null:,
>>> from bs4 import BeautifulSoup
>>> html3= """<a name="definition"> </a>
... <h2><span class="sectioncount">3.342.2323</span> Content Logical Definition <a title="link to here" class="self-link" href="valueset-investigation"><img src="ta.png"/></a></h2>
... <hr/>
... <div><p from the following </p><ul><li>Include these codes as defined in http://snomed.info/sct<table><tr><td><b>Code</b></td><td><b>Display</b></td></tr><tr><td>34353553</td><td>Examination / signs</td><td/></tr><tr><td>35453453453</td><td>History/symptoms</td><td/></tr></table></li></ul></div>
... <p> </p>"""
>>> soup = BeautifulSoup(html3, "lxml")
>>> h2 = soup.find(lambda elm: elm.name == "h2" and "Content Logical Definition" in elm.text)
>>> for sibling in h2.next_siblings:
...     print(sibling)
... 
<hr/>
<div><p following="" from="" the=""></p><ul><li>Include these codes as defined in http://snomed.info/sct<table><tr><td><b>Code</b></td><td><b>Display</b></td></tr><tr><td>34353553</td><td>Examination / signs</td><td></td></tr><tr><td>35453453453</td><td>History/symptoms</td><td></td></tr></table></li></ul></div>
<p> </p>
import requests
from bs4 import BeautifulSoup

urls = [
    'https://www.hl7.org/fhir/valueset-activity-reason.html',
    'https://www.hl7.org/fhir/valueset-age-units.html'
]

for url in urls:
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'lxml')

    h2 = soup.find(lambda elm: elm.name == "h2" and "Content Logical Definition" in elm.text)
    table = None
    for sibling in h2.find_next_siblings():
        if sibling.name == "table":
            table = sibling
            break
        if sibling.name == "h2":
            break
    print(table)