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> <a href="http://www.amazon.com/review/R41M1I2K413NG/ref=cm_aya_cmt?ie=UTF8&ASIN=B013IZY7RU#wasThisHelpful" >Comment</a> | <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.
Wie können wir das reproduzieren? Zeigen Sie uns den genauen Code, der den abgeschnittenen Attributwert zurückgibt. – mzjn
Wie lautet die URL, die Sie beim Aufruf von 'request.get()' verwenden? – Markus
http://www.amazon.com/gp/cdp/member-reviews/ARPJ98Y7U8K5H?ie=UTF8&display=public&page=3&sort_by=MostRecentReview –