2015-10-29 50 views
1

我正在刮一些韩文语言文本,并且因为缺少一个更好的单词而遇到很多“链接感叹词”,其中html看起来像这样...scrapy/xpaths/regex:正确的xpath/re忽略“链接感叹号”

<a href="path" title="저">는</a> 좋아요 

它显示 '저' 作为一个超链接,但 '는좋아요' 作为普通的文本。他们是同一个字对象的现实的一部分,并显示在页面上'저는좋아요요不过在使用这个XPath和正则表达式...

foo = response.xpath('//*[@id="divID"]/p//text()').re(ur'[\uac00-\ud7af]+') 

将其拆分为列表中的两个词刮时.. 。

foo == ['저', '는', '좋아요'] 

我怎么能得到这个保持一个字,就像我原来的意图?

intended: foo == ['좋는', '좋아요'] 

编辑:(评论响应)

用。加入的问题()是将加入所有的定期刮的话,以及据我可以告诉。所以,我最终会与此...

''.join(foo) == ['좋는좋아요'] 

所以我不认为。加入()会工作,除非有我丢失的东西

+0

是' ''。加入(富)'有帮助吗? – eLRuLL

+0

请参阅编辑请 – deltaskelta

+0

将其分解为两部分提取:提取链接后的文本('좋아요')并提取链接文本本身。如果您单独执行此操作,则可以将'​​저'和'는'连接在一起。 – GHajba

回答

2

如果你想上的字符串表示工作一个HTML元素,XPath有一个string() function,可以是非常有用的。

一旦你有一个元素的单个字符串,你可以应用正则表达式的单词。

下面是一个示例Python解释器会话(我不得不改变你的标记位,以匹配显示的结果):

>>> import scrapy 
>>> 
>>> response = scrapy.Selector(text=u'<p><a href="path" title="저">저</a>는 좋아요</p>') 

.//text()将选择所有后代文本节点,作为单独的字符串时.extract() ED(2在这种情况下字符串):

>>> response.xpath('.//p//text()').extract() 
[u'\uc800', u'\ub294 \uc88b\uc544\uc694'] 

并与正则表达式,你会发现1个字,然后2个字:

>>> response.xpath('.//p//text()').re(ur'[\uac00-\ud7af]+') 
[u'\uc800', u'\ub294', u'\uc88b\uc544\uc694'] 
>>> for e in response.xpath('.//p//text()').re(ur'[\uac00-\ud7af]+'): 
...  print e 
... 
저 
는 
좋아요 

如果段落元素上使用XPath string()功能,你会得到一个字符串,即使该元素具有其他孩子一样a

>>> response.xpath('string(.//p)').extract() 
[u'\uc800\ub294 \uc88b\uc544\uc694'] 
>>> print response.xpath('string(.//p)').extract_first() 
저는 좋아요 

然后你就可以申请你的正则表达式来分割上话:

>>> response.xpath('string(.//p)').re(ur'[\uac00-\ud7af]+') 
[u'\uc800\ub294', u'\uc88b\uc544\uc694'] 
>>> for e in response.xpath('string(.//p)').re(ur'[\uac00-\ud7af]+'): 
...  print e 
... 
저는 
좋아요 

注意string(node-set)只考虑在第一个元素的节点集合传递作为参数,所以一定要确保你的XPath表达式第一个你想要的元素相匹配,或者与涉农供应链,你也可以链XPath表达式PY选择:

>>> for e in response.xpath('.//p').xpath('string(.)').re(ur'[\uac00-\ud7af]+'): 
...  print e 
... 
저는 
좋아요 
+0

这工作完美,谢谢 – deltaskelta