Доступ к определенной таблице в теге html

Я собираюсь использовать BeautifulSoup, чтобы найти таблицу, которая определена в «логическом определении контента» по следующим ссылкам:

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 

На страницах может быть определено несколько таблиц. Таблица, которую я хочу, находится под <h2> tag with text “content logical definition”. На некоторых страницах может отсутствовать какая-либо таблица в разделе «логическое определение контента», поэтому я хочу, чтобы таблица была нулевой. К настоящему времени я попробовал несколько решений, но каждое из них возвращает неправильную таблицу для некоторых страниц.

Последнее решение, предложенное 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)

Это решение возвращает значение null, если в разделе «логическое определение контента» нет таблицы, но для второго URL-адреса, имеющего таблицу в «логическом определении контента», оно возвращает неправильную таблицу, таблицу в конце страницы.
Как можно Я редактирую этот код, чтобы получить доступ к таблице, определенной сразу после тега с текстом «логическое определение контента», и если в этом разделе нет таблицы, он возвращает null.


person Mary    schedule 31.05.2016    source источник
comment
На веб-странице есть три таблицы. какой стол вы ищете?   -  person Vivek    schedule 31.05.2016
comment
Можете ли вы указать, какая именно страница вызывает у вас проблему? Я не понимаю, о каком втором URL вы говорите.   -  person bmcculley    schedule 31.05.2016
comment
Готовы ли вы использовать lxml?   -  person Padraic Cunningham    schedule 01.06.2016


Ответы (1)


Похоже, проблема с кодом alecxe заключается в том, что он возвращает таблицу, которая является прямым братом 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)
person Noah    schedule 31.05.2016
comment
@ Ноа, большое спасибо! Это отличный код, работает очень хорошо. Не могли бы вы проверить мой другой вопрос по следующей ссылке: stackoverflow.com/questions/37555709/. Еще раз спасибо! - person Mary; 01.06.2016
comment
@ Падраик, спасибо за комментарий! Итак, что вы предлагаете? - person Mary; 03.06.2016