Python - извлечение данных между конкретными узлами комментариев с BeautifulSoup 4

Нужно выбрать конкретные данные на сайте, такие как цены, информация о компании и т. Д. К счастью, дизайнер сайта добавил много тегов, таких как

<!-- Begin Services Table -->
' desired data
<!-- End Services Table -->

Какой код мне нужен для того, чтобы BS4 возвращал строки между заданными тегами?

import requests
from bs4 import BeautifulSoup

url = "http://www.100ll.com/searchresults.phpclear_previous=true&searchfor="+'KPLN'+"&submit.x=0&submit.y=0"

response = requests.get(url)
soup = BeautifulSoup(response.content, "lxml")

text_list = soup.find(id="framediv").find_all(text=True)
start_index = text_list.index(' Begin Fuel Information Table ') + 1
end_index = text_list.index(' End Fuel Information Table ')
for item in text_list[start_index:end_index]:
    print(item)

Вот этот веб-сайт:

http://www.100ll.com/showfbo.php?HashID=cf5f18404c062da6fa11e3af41358873

1 ответ

Решение

Если вы хотите выбрать table элемент после этих конкретных комментариев, затем вы можете выбрать все узлы комментариев, отфильтровать их на основе требуемого текста, а затем выберите следующий брат table элемент:

import requests
from bs4 import BeautifulSoup
from bs4 import Comment

response = requests.get(url)
soup = BeautifulSoup(response.content, "lxml")

comments = soup.find_all(string=lambda text:isinstance(text,Comment))

for comment in comments:
    if comment.strip() == 'Begin Services Table':
        table = comment.find_next_sibling('table')
        print(table)

В качестве альтернативы, если вы хотите получить все данные между этими двумя комментариями, вы можете найти первый комментарий, а затем перебрать все последующие элементы, пока не найдете заключительный комментарий:

import requests
from bs4 import BeautifulSoup
from bs4 import Comment

response = requests.get(url)
soup = BeautifulSoup(response.content, "lxml")

data = []

for comment in soup.find_all(string=lambda text:isinstance(text, Comment)):
    if comment.strip() == 'Begin Services Table':
        next_node = comment.next_sibling

        while next_node and next_node.next_sibling:
            data.append(next_node)
            next_node = next_node.next_sibling

            if not next_node.name and next_node.strip() == 'End Services Table': break;

print(data)
Другие вопросы по тегам