2016-07-29 4 views
2

Hoffentlich brauchen Sie nicht den gesamten Satz von Code hier, aber ich habe ein Problem, wo ich HTML analysieren, mit XPath und ich bekomme nicht, was ich ' d erwarten:XPath funktioniert nicht, wie ich es erwarten würde

# here is the current set of tags I'm interested in 
html = '''<div style="padding-top: 10px; clear: both; width: 100%;"> 
     <a href="http://www.amazon.com/review/R41M1I2K413NG/ref=cm_aya_cmt?ie=UTF8&ASIN=B013IZY7RU#wasThisHelpful" ><img src="http://g-ecx.images-amazon.com/images/G/01/x-locale/communities/discussion_boards/comment-sm._CB192250344_.gif" width="16" alt="Comment" hspace="3" align="absmiddle" height="16" border="0" /></a>&nbsp;<a href="http://www.amazon.com/review/R41M1I2K413NG/ref=cm_aya_cmt?ie=UTF8&ASIN=B013IZY7RU#wasThisHelpful" >Comment</a>&nbsp;|&nbsp;<a href="http://www.amazon.com/review/R41M1I2K413NG/ref=cm_cr_rdp_perm" >Permalink</a>''' 

ich versuche, den href Wert des ersten a-Tages zu erhalten, die eine lange URL ist. Um dies zu tun verwende ich den folgenden Code

from lxml import etree 
import StringIO 

parser = etree.HTMLParser(encoding="utf-8") 
tree = etree.parse(StringIO.StringIO(html), parser) 

style = 'padding-top: 10px; clear: both; width: 100%;' 
xpath = "//div[@style='%s']" % style 
xpath += "/a[1]/@href" 

# use the XPath expression above to pull out the href value 
tree.xpath(xpath) 


['http://www.amazon.com/review/R41M1I2K413NG/ref=cm_aya_cmt?ie=UTF8&ASIN=B013IZY7RU#wasThisHelpful'] 

Dies funktioniert, wenn ich das Teil herausziehen arbeite ich mit und es als eine Zeichenfolge einfügen. Dies funktioniert nicht genau das gleiche mit der tree Ich habe mit einem request.get() Anruf gebaut und ich kann nicht herausfinden, warum? Was es zurück gibt ist:

['http://www.amazon.com/review/R41M1I2K413NG] 

Und ich kann nicht herausfinden, warum. Ich verstehe, dass ich hier im Dunkeln fotografiere, aber ich hoffe nur, dass jemand auf einen "XPath-Rückgabewert des Attributs abgeschnitten" gestoßen ist.

EDIT:

Hier ist der vollständige Code, die ich zur Zeit verwenden, aber es funktioniert nicht. Es gibt den abgeschnittenen Wert oben zurück.

from lxml import etree 
import requests 
import StringIO 
from requests.packages.urllib3.util.retry import Retry 
from requests.adapters import HTTPAdapter 


session = requests.Session() 
retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504]) 
session.mount('http://www.amazon.com', HTTPAdapter(max_retries=retries)) 
parser = etree.HTMLParser(encoding=encoding) 

url = "http://www.amazon.com/gp/cdp/member-reviews/ARPJ98Y7U8K5H?ie=UTF8&display=public&page=3&sort_by=MostRecentReview" 
page = session.get(url, timeout=5) 
tree = etree.parse(StringIO.StringIO(page.text), parser) 

style = 'padding-top: 10px; clear: both; width: 100%;' 
xpath = "//div[@style='%s']" % style 
xpath += "/a[1]/@href" 

# use the XPath expression above to pull out the href value 
tree.xpath(xpath) 

EDIT 2:

Dies macht aus irgendeinem Grund zu arbeiten. Anstatt ein session Objekt zu erzeugen und, dass eine get Antrag stellen verwenden, dann passieren, dass an den parser, einfach das Bestehen der url Zeichenfolge an die parser Werke:

url = "http://www.amazon.com/gp/cdp/member-reviews/ARPJ98Y7U8K5H?ie=UTF8&display=public&page=3&sort_by=MostRecentReview" 


tree = etree.parse(url, parser) 



for e in tree.xpath("//div[@style='padding-top: 10px; clear: both; width: 100%;']/a[1]/@href"): 

    print e 

Wie ich es verstehe, wenn über mehrere URLs looping Das Sitzungsobjekt behält Verbindungsattribute bei, die den Prozess beschleunigen. Wenn ich die etree.parse(url, parser) Methode benutze, mache ich mir Sorgen, dass ich die Effizienz verliere.

+1

Wie können wir das reproduzieren? Zeigen Sie uns den genauen Code, der den abgeschnittenen Attributwert zurückgibt. – mzjn

+0

Wie lautet die URL, die Sie beim Aufruf von 'request.get()' verwenden? – Markus

+0

http://www.amazon.com/gp/cdp/member-reviews/ARPJ98Y7U8K5H?ie=UTF8&display=public&page=3&sort_by=MostRecentReview –

Antwort

0

Mit der von Ihnen angegebenen URL, der folgende Python-Code:

url = "http://www.amazon.com/gp/cdp/member-reviews/ARPJ98Y7U8K5H?ie=UTF8&display=public&page=3&sort_by=MostRecentReview" 

from lxml import etree 
parser = etree.HTMLParser(encoding="utf-8") 
tree = etree.parse(url, parser) 

for e in tree.xpath("//div[@style='padding-top: 10px; clear: both; width: 100%;']/a[1]/@href"): 

    print e 

Ergebnisse in der folgenden Ausgabe:

> python ~/test.py 

http://www.amazon.com/review/RM8YYCQ57K2CL/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B00J9PAZIO#wasThisHelpful 
http://www.amazon.com/review/R41M1I2K413NG/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B013IZY7RU#wasThisHelpful 
http://www.amazon.com/review/R3DT6VUDGIT9SK/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B000VYD0MA#wasThisHelpful 
http://www.amazon.com/review/RGFW1JM4151MW/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B00TQQN5G0#wasThisHelpful 
http://www.amazon.com/review/R3I9FFX0MVF1BW/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B0048A7NF8#wasThisHelpful 
http://www.amazon.com/review/R24TTSQY34VME8/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B0115ZHH68#wasThisHelpful 
http://www.amazon.com/review/R3C49WWMNQZ007/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B00ABAWHJ6#wasThisHelpful 
http://www.amazon.com/review/R37724EHW829NB/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B00TO5Y3FK#wasThisHelpful 
http://www.amazon.com/review/RQKGM5FRXVYSX/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B0051QUWKG#wasThisHelpful 
http://www.amazon.com/review/R1DW61PMGUDMDJ/ref=cm_aya_cmt/159-5911033-5890330?ie=UTF8&ASIN=B000N8Q2P6#wasThisHelpful 

den Beispielcode verwenden Sie die Ergebnisse in zur Verfügung gestellt:

http://www.amazon.com/review/RM8YYCQ57K2CL 
http://www.amazon.com/review/R41M1I2K413NG 
http://www.amazon.com/review/R3DT6VUDGIT9SK 
http://www.amazon.com/review/RGFW1JM4151MW 
http://www.amazon.com/review/R3I9FFX0MVF1BW 
http://www.amazon.com/review/R24TTSQY34VME8 
http://www.amazon.com/review/R3C49WWMNQZ007 
http://www.amazon.com/review/R37724EHW829NB 
http://www.amazon.com/review/RQKGM5FRXVYSX 
http://www.amazon.com/review/R1DW61PMGUDMDJ 

Dies ist aufgrund der Tatsache, dass keine der URLs in der HTML-Seite von session.get() zurückgegeben h ave irgendwelche GET Parameter; entweder weil der Server in diesem Fall keine URLs mit GET-Parametern zurückgibt oder weil requests die GET-Parameter entfernt.

+0

Ja, das ist genau das, was ich tue .... Ich werde mit frischen Augen wieder darauf zurückkommen müssen. Danke für Ihre Hilfe. –

+0

Also, wenn ich die 'etree.parse (URL, Parser)' ', funktioniert es. Wenn Sie jedoch zuerst den HTML-Code aus einem 'session.get (url)' holen und das 'text'-Attribut wie' etree.parse (page.text, parser) 'übergeben, bekomme ich ein falsches Ergebnis. Ich möchte mit dem 'session.get()' b/c die Verbindung zwischen den Anfragen halten. –

Verwandte Themen