2017-02-18 6 views
0

Blick auf bestimmte Daten von einer Website wie Preise, Info über das Unternehmen usw. Zum Glück herausgreifen, die Website-Designer haben setzten viele Tags wiePython - Extrahieren von Daten zwischen spezifischen Kommentarknoten mit BeautifulSoup 4

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

Welche Art von Code würde ich benötigen, damit BS4 die Strings zwischen den gegebenen Tags zurückgibt?

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) 

Hier ist die Website in Frage:

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

+4

SO ist kein freier Codierung Service. Sie müssen versuchen, das Problem selbst zu lösen. Wenn es nicht funktioniert, poste, was du versucht hast, und wir helfen dir, es zu beheben. – Barmar

+1

Entschuldigung, dass @Barmar vergessen habe, meinen ursprünglichen Code zu posten! –

Antwort

1

Wenn Sie das table Element nach diesen spezifischen Kommentar (e) auswählen möchten, dann können Sie alle Kommentarknoten auswählen, filtern sie basierend auf den gewünschten Text, und wählen Sie die das Element nächsten Geschwister 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) 

Alternativ i f Sie alle Daten zwischen diesen beiden Kommentaren erhalten möchten, dann können Sie den ersten Kommentar finden und dann durchlaufen alle nächsten Geschwister, bis Sie das Schließen Kommentar finden:

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) 
Verwandte Themen