2017-02-26 3 views
0

Ich möchte verschiedene Elemente aus Tabellen und Absatztexten von dieser Website extrahieren.Web-Elemente Extraktion von Websites mit Python

https://www.instituteforsupplymanagement.org/about/MediaRoom/newsreleasedetail.cfm?ItemNumber=30655

Dies ist der Code ich verwende:

import lxml 
from lxml import html 
from lxml import etree 
import urllib2 
source = urllib2.urlopen('https://www.instituteforsupplymanagement.org/about/MediaRoom/newsreleasedetail.cfm?ItemNumber=30656&SSO=1').read() 
x = etree.HTML(source) 
growth = x.xpath("//*[@id="home_feature_container"]/div/div[2]/div/table[2]/tbody/tr[3]/td[2]/p)") 
growth 

Was ist der beste Weg, um die Elemente, die ich von einer Website extrahieren möchten, ohne jedes Mal die XPath im Code ändern zu müssen? Sie veröffentlichen jeden Monat neue Daten auf derselben Website, aber der XPath scheint sich manchmal ein wenig zu ändern.

+0

Was sind die Elemente, die Sie wollen? Ihr XPath ist ungültig und kann auf dieser Seite nicht getestet werden. –

+0

Ich habe den XPath geändert. Ich brauche Elemente aus der Tabelle "Manufacturing auf einen Blick". Und auch der Absatztext. –

Antwort

1

Wenn die Position der Elemente, die Sie Änderungen regelmäßig, versuchen sie mit Namen abzurufen. So können Sie beispielsweise die Elemente aus der Tabelle in der Zeile "Neue Aufträge" extrahieren.

import requests #better than urllib 
from lxml import html, etree 

url = 'https://www.instituteforsupplymanagement.org/about/MediaRoom/newsreleasedetail.cfm?ItemNumber=30655&SSO=1' 
page = requests.get(url) 
tree = html.fromstring(page.content) 

neworders = tree.xpath('//strong[text()="New Orders"]/../../following-sibling::td/p/text()') 

print(neworders) 

Oder wenn Sie die ganze HTML-Tabelle wollen:

data = tree.xpath('//th[text()="MANUFACTURING AT A GLANCE"]/../..') 

for elements in data: 
    print(etree.tostring(elements, pretty_print=True)) 

Ein weiteres Beispiel mit BeautifulSoup

from bs4 import BeautifulSoup 
import requests 

url = "https://www.instituteforsupplymanagement.org/about/MediaRoom/newsreleasedetail.cfm?ItemNumber=30655&SSO=1" 

content = requests.get(url).content 

soup = BeautifulSoup(content, "lxml") 

table = soup.find_all('table')[1] 

table_body = table.find('tbody') 

data= [] 
rows = table_body.find_all('tr') 
for row in rows: 
    cols = row.find_all('td') 
    cols = [ele.text.strip() for ele in cols] 
    data.append([ele for ele in cols if ele]) 

print(data) 
+0

Hey Ettore, da war ein kleines Problem. Ich habe hier beschrieben: http://stackoverflow.com/q/42592948/4399016 Danke !! –

0

BeautifulSoup zur Rettung:

from bs4 import BeautifulSoup 
import urllib2 

r = urllib2.urlopen('https://www.instituteforsupplymanagement.org/about/MediaRoom/newsreleasedetail.cfm?ItemNumber=30655') 
soup = BeautifulSoup(r) 
soup.find('div', {'id': 'home_feature_container'}, 'h4') 

Dieser Code ist auf dem Weg, um die Spezifikation zu erfüllen, wie beschrieben. Wenn Sie soup.find().contents verwenden, erstellte es eine Liste jedes Elements, das in dem Element enthalten ist.

Soweit für die Änderungen auf der Seite zu berücksichtigen, kommt es wirklich darauf an. Wenn die Änderungen dramatisch sind, müssten Sie soup.find() ändern. Andernfalls können Sie möglicherweise Code schreiben, der allgemein genug ist, dass er immer angewendet wird. (Wie, wenn der angerufene divhome_feature_container wird immer vorgestellten, würden Sie nie ändern.)

+0

Hallo, könnten Sie ein Beispiel für Code zeigen, der einen Wert zurückgibt. Es gibt eine Tabelle "HERSTELLUNG AUF EINEN BLICK". Könnten Sie zeigen, dass ein Element mit Ihrer Technik extrahiert und angezeigt wird? Danke vielmals!! –