2017-02-18 17 views
0

Глядя, чтобы выбрать конкретные данные с веб-сайта, такие как цены, информация о компании и т.д. К счастью, веб-сайт дизайнер положил много тегов, таких как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

+4

SO не является бесплатным сервис кодирования. Вы должны попытаться решить проблему самостоятельно. Если вы не можете заставить его работать, напишите, что вы попробовали, и мы поможем вам исправить это. – Barmar

+1

Извините, что @Barmar Я забыл опубликовать свой оригинальный код! –

ответ

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)