2016-03-22 31 views
0

我已经使用scrapy从网页获取数据。我遇到了如下问题。如何获得与Scrapy的完整链接文本

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

在网页中,该记录的名称看起来是这样的: enter image description here

我想要得到的内容(例如:人X-大肠杆菌)在<a>标记,不想获取其他标签。这里是我的代码:

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 

我试图给的unicode转换为UTF-8,但结果仍然是这样的:

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

有时也会有一些字符在记录中缺失。 所以我想知道如何从HTML代码中获得完整和正确的格式数据。

+0

的Unicode转换为UTF-8并没有太大的意义; UTF-8 *是* Unicode。你的结果与HTML不匹配,你能展示结果所指的真实HTML吗? – JJJ

+0

对不起,这个是正确的** {“Link”:[“NEW-IMAGE?type = GENE&object = EG10567”],“Name”:“[u'X - ']”},**,你可以看到它的名称不完整 –

+0

我会为你编辑问题;尽量确保所有数据都是相关的。 Unicode与此无关。 – JJJ

回答

1

我建议你使用XPath's normalize-space()

正规化空间函数返回的参数字符串,这些空白由一个单一的空间剥离的空白字符开头和结尾的空白并替代序列标准化。空白字符与XML中S生产所允许的字符相同。如果省略参数,则默认将上下文节点转换为字符串,换句话说就是上下文节点的字符串值。

>>> 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

我试过这种方法,我得到了几乎有序的数据,但是有一个问题,有些字符似乎无法正确获取,例如:网页中的数据是'β-1,4 -D甘露糖基 - N-乙酰基d-GL ucosamine degradation“,我得到的数据是”{“Link”:[“NEW-IMAGE?type = PATHWAY&object = PWY-7586”],“Name”:“\ u03b2-1,4-D-甘露糖基-N-乙酰-D-葡糖胺降解“},'。正如你所看到的,字符**β**不正确。那么如何解决这个问题呢? –

+0

'u'\ u03b2''并不正确,它就是Python2代表'β'的方式。在你的python解释器中试试它:'>>>u'β''你会得到'u'\ u03b2''。如何导出这些Unicode数据会很重要,无论是JSON还是XML等,转换都会发生,因为链中的下一个工具需要解释。建议尽可能使用Python中的Unicode字符串。只有在导出时,您才需要对其他工具的数据进行编码。 –

+0

所以没有办法在Python中打印β,只有当我继续处理数据时,我应该考虑这个问题? –

0

如果你想获得a标签的文字和其子的,你需要使用//text()代替text()

试试这个:

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

您可以使用另一个模块html2text获得的纯文本特定的标签。

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

对不起,我试过这种方法,但结果变得更加混乱。 –

+0

你可以给出输出吗? – Rahul

+0

我只想得到标签中的内容,如果我使用你的方法,我会得到这么多不相关的数据 –

0

我想要得到的内容(例如:人X-大肠杆菌)在<a>标签,不想让其他的标签。

问题的一部分是文本并非全部包含在<a>标记中。其中一些嵌套在<i>标签下面<a>标签中。要获得完整的链接文本字符串:

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' 

//a//text()手段递归抢下的所有<a>标签及其在文档中的孩子的所有文字。你sel.xpath('//ul/li/a[contains(@href,"NEW-IMAGE")]/text()').extract()将得到“一些文本”

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

但会忽略“多一些这里的” <b>标签内:

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