访问 html 标签中的特定 table

Access to a specific table in html tag

我打算用beautifulsoup找一个table定义在以下链接的“内容逻辑定义”中:

1) https://www.hl7.org/fhir/valueset-account-status.html
2) https://www.hl7.org/fhir/valueset-activity-reason.html
3) https://www.hl7.org/fhir/valueset-age-units.html 

页面中可能定义了几个table。我要的table在<h2> tag with text “content logical definition”下面。有些页面可能在“内容逻辑定义”部分缺少任何table,所以我希望table为空。到目前为止,我尝试了几种解决方案,但对于某些页面,它们中的每一种都 return 错误 table。

alecxe 提供的最后一个解决方案是:

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)

此解决方案 return 如果没有 table 位于“内容逻辑定义”部分,但第二个 url 在“内容”中具有 table,则为空逻辑定义”它return错了table,页尾有一个table。
我如何编辑此代码以访问恰好在具有“内容逻辑定义”文本的标记之后定义的 table,如果本节中没有 table,则它 return 为空。

看起来 alecxe 代码的问题在于它 returns 一个 table 是 h2 的直接兄弟,但你想要的实际上在 div (这是 h2 的兄弟)。这对我有用:

import requests
from bs4 import BeautifulSoup

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


def extract_table(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'lxml')

    h2 = soup.find(lambda elm: elm.name == 'h2' and 'Content Logical Definition' in elm.text)
    div = h2.find_next_sibling('div')
    return div.find('table')


for url in urls:
    print extract_table(url)