2016-03-22 13 views
0

Ich habe Scrapy verwenden, um Daten von der Webseite zu erhalten. Und ich stieß auf ein Problem wie unten.So erhalten Sie den vollständigen Linktext mit Scrapy

<li> 
<a href="NEW-IMAGE?type=GENE&amp;object=EG10567"> 
<b> 
man 
</b> 
X - 
<i> 
Escherichia coli 
</i> 
</a> 
<br> 
</li> 

In Webseite, sieht der Datensatz Namen wie folgt aus: enter image description here

ich den Inhalt erhalten möchten (zB: Mann X-Escherichia coli) im <a> Tag und wollen nicht Erhalte andere Tags. Und hier ist mein Code:

def parse(self, response): 
    sel = Selector(response) 
    sites = sel.xpath('//ul/li/a[contains(@href,"NEW-IMAGE")]') 
    base_url = "http://www.metacyc.org/META" 
for site in sites: 
    item = MetaCyc() 
    name_tmp = map(unicode.strip, site.xpath('text()').extract()) 
    item['Name'] = unicode(name_tmp).encode('utf-8') 
    item['Link'] = map(unicode.strip, site.xpath('@href').extract()) 
    yield item 

ich versucht habe, die Unicode zu utf-8, zu konvertieren, aber die Ergebnisse sieht immer noch wie folgt aus:

{"Link": ["NEW-IMAGE?type=GENE&object=EG10567"], "Name": "[u'X -']"} 

Manchmal wird es einige Zeichen haben fehlt in den Aufzeichnungen. Also ich möchte wissen, wie man die vollständigen und korrekten Formatdaten vom HTML-Code erhält.

+0

Konvertieren von Unicode in UTF-8 nicht viel Sinn machen; UTF-8 * ist * Unicode. Ihr Ergebnis stimmt nicht mit dem HTML-Code überein. Können Sie den tatsächlichen HTML-Code angeben, auf den sich das Ergebnis bezieht? – JJJ

+0

Entschuldigung, dieser ist korrekt ** {"Link": ["NEW-IMAGE? Type = GENE & object = EG10567"], "Name": "[u'X - ']"}, **, können Sie die sehen Name ist nicht vollständig –

+0

Ich werde die Frage für Sie bearbeiten; versuchen Sie sicherzustellen, dass alle Daten relevant sind. Unicode hat damit nichts zu tun. – JJJ

Antwort

1

Ich schlage vor, Sie verwenden XPath's normalize-space()

Die normalize-space-Funktion das Argument Zeichenfolge mit Leerzeichen durch Strippen führende und nachfolgende Leerzeichen normalisiert zurückgibt und Sequenzen von Leerzeichen durch ein Leerzeichen ersetzt werden. Whitespace-Zeichen entsprechen denen, die von der S-Produktion in XML zugelassen werden. Wenn das Argument nicht angegeben wird, wird standardmäßig der Context-Knoten in eine Zeichenfolge konvertiert, dh der String-Wert des Context-Knotens.

>>> html = """<li> 
... <a href="NEW-IMAGE?type=GENE&amp;object=EG10567"> 
... <b> 
... man 
... </b> 
... X - 
... <i> 
... Escherichia coli 
... </i> 
... </a> 
... <br> 
... </li>""" 
>>> import scrapy 
>>> selector = scrapy.Selector(text=html) 

>>> 
>>> links = selector.xpath('//li/a[contains(@href,"NEW-IMAGE")]') 
>>> for link in links: 
...  item = {} 
...  item['Name'] = link.xpath('normalize-space(.)').extract_first() 
...  item['Link'] = link.xpath('@href').extract_first() 
...  print(item) 
... 
{'Link': u'NEW-IMAGE?type=GENE&object=EG10567', 'Name': u'man X - Escherichia coli'} 
>>> 
+0

Ich habe diese Methode ausprobiert, und ich habe fast Daten bestellt, aber es gibt ein Problem.Einige Zeichen scheint nicht richtig zu erhalten zB: Die Daten auf der Webseite ist '-1,4 -D-Mannosyl-N-acetyl-D-gl ucosamine degradation ', und die Daten, die ich habe, ist' {"Link": ["NEW-IMAGE? type = PATHWAY & Objekt = PWY-7586"], "Name": "\ u03b2-1,4-D-mannosyl -N-Acetyl-D-glucosamin-Abbau "},". Wie Sie sehen können, ist das Zeichen ** β ** falsch. So, wie man dieses Problem löst? –

+0

'u '\ u03b2'' ist nicht falsch, es ist wie Python2' β' darstellt. Probieren Sie es in Ihrem Python-Interpreter aus: '>>> Sie bekommen 'u' \ u03b2''. Wie Sie diese Unicode-Daten exportieren, spielt dann eine Rolle, ob es JSON oder XML oder etwas ist. Die Konvertierung wird dann für Ihr nächstes Tool in der Kette stattfinden. Es wird empfohlen so viel wie möglich mit Unicode-Strings in Python zu arbeiten. Nur beim Exportieren müssten Sie die Daten für andere Werkzeuge codieren. –

+0

Also gibt es keine Methode, um β in Python zu drucken, nur wenn ich mich weiter mit den Daten beschäftige, sollte ich dieses Problem betrachten? –

0

Wenn Sie Text von a Tag bekommen und seine Kinder Sie diese //text() statt text()

Versuchen Sie verwenden müssen:

name_tmp = map(unicode.strip, site.xpath('//text()').extract()) 

Sie ein anderes Modul verwenden können html2text nur Text eines bekommen bestimmtes Tag.

import html2text 
htmlconverter = html2text.HTML2Text() 
print htmlconverter.handle(''.join(name_tmp)) 
+0

Sorry, ich habe diese Methode versucht, aber das Ergebnis wird ungeordneter. –

+0

Können Sie die Ausgabe geben? – Rahul

+0

Ich möchte nur den Inhalt im Tag, Wenn ich Ihre Methode verwenden, werde ich so viele irrelevante Daten –

0

Ich möchte den Inhalt bekommen (z .: Mann X-Escherichia coli) im <a> Tag und wollen nicht andere Tags erhalten.

Teil des Problems ist, dass der Text nicht alle im <a> Tag enthalten ist. Einige davon sind im <i> Tag unter dem <a> Tag verschachtelt. Um den vollständigen Link-Text als String zu erhalten:

item_name = " ".join([word.strip() for word in sel.xpath('//li/a[contains(@href,"NEW-IMAGE")]//text()').extract() if len(word.strip())]) 
# => item_name = 'man X - Escherichia coli' 

Die //a//text() Mittel rekursiv greifen den gesamten Text unter allen <a>-Tags und ihre Kinder im Dokument.Ihre sel.xpath('//ul/li/a[contains(@href,"NEW-IMAGE")]/text()').extract() bekommen würde "Some Text"

<a href="../">Some text</a> 

Aber würde weglassen "Und einige mehr hier" innerhalb der <b> tags:

<a href="../">Some text<b>And some more here</b></a> 
Verwandte Themen