如何在xpath中使用matches函数提取英文单词
我对 scrapy
和 python
完全是个新手。请问我怎么用 xpath
抽取一个英文单词呢?
这里有一段 HTML
页面代码:
<span title="vacant">
vacant
</span>
<span title="linen">
linen
</span>
我想从 <span tile>
字段中提取英文单词。
我试过这样写 selector.xpath("//span[matches(@title, '\w+')]/text()").extract()
,但是总是出现语法错误。
有没有人能指导我正确的方法?
更新 1:
我已经为 python 安装了 lxml
包,所以我觉得 matches
函数是有效的。顺便说一下,我用 xpath
的 contains
函数也能正常工作。
这是我使用 contains
函数的方法:
selector.xpath("//span[contains(@title,'.')]/text()").extract()
更新 2:
其实我是在抓取一个英汉词典,首先,我想提取一个英文单词(随机一个单词),它的 HTML 源代码如上所示;其次,我想提取与这个英文单词对应的中文释义,相关的 HTML 源代码如下:
<span title="adj. [Chinese paraphrase of vacant]" style="display:block;">
adj. [Chinese paraphrase of vacant]
</span>
我使用上面提到的 contains
函数来提取中文释义,这对我来说效果很好。
但是我该如何使用 matches
函数来提取英文单词呢?
我这样说清楚我的目标了吗?
更新 3:
我抓取的页面在 这里,请查看这个页面的源代码。
更新 4:
我在 xpath
中使用 matches
函数时出现的错误信息是:
>>> sel.xpath("//span[matches(@title, '\w')]/text()").extract()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/scrapy/selector/unified.py", line 90, in xpath
raise ValueError("Invalid XPath: %s" % query)
ValueError: Invalid XPath: //span[matches(@title, '\w')]/text()
3 个回答
我自己对这个也不是很熟,但我查了不少资料关于使用Scrapy,我觉得我可以帮你解释一下代码的意思:
return [item for item in items if re.match('[a-z]$', item.strip('\t\n\r')]
这里的re
是“正则表达式”(RegEx)的缩写,所以后面跟着的[a-z]$
就是一个正则表达式,用来匹配:这基本上是说任何一个英文字母,也就是从a到z的字母。
我最熟悉的正则表达式是在Apache中使用的,那里$
表示字符串的结尾,但在这里我不太确定,看起来更像是用作通配符。
items.strip
的意思是“要去掉的项”,而且它是用来处理空白字符的正则表达式(在ASCII中,我想...我不太确定,但我知道这和文档的编码以及正则表达式如何解析和匹配有关)。
\n
表示“换行”。
我猜\t
是“制表符”,而\r
可能是“回车”(或者也可能是“空格”)。
这个规则可能是为了确保Unix风格的行结束符(源文件中的)\n
和Windows风格的行结束符,我想是\n\r
。
所以如果解释的话,我觉得这段代码实际上是在说……
“为数组中的每一项生成一个符合以下条件的项:它们包含从a到z的任何英文字母,并忽略‘换行’、‘制表符’和‘回车’这些字符。”
我还怀疑i
在i.strip
中是“忽略大小写”的缩写,意思是匹配大写和小写字母。
你能试试这段代码吗?
words = selector.xpath('//ul[@id="word_list_1"]/li')
for w in words:
word_english = w.xpath('./div[@class="word_main_list_w"]/span/@title').extract()
word_chinese = w.xpath('./div[@class="word_main_list_s"]/span/text()').extract()
经过一些研究,我发现了这个页面。我正在使用scrapy 0.22.2
,它只支持xpath 1.0
,你可以参考XML路径语言(XPath)版本1.0,在这个版本中是没有matches
这个函数的。所以我必须在Python层面来处理这个问题。为了提取所有有效的英文单词,我需要:
wordList = []
def isAllAlpha(s):
format = 'abcdefghijklmnopqrstuvwxyz'
for c in s:
if not c in format:
return False
return True
def initWordList()
for i in \
sel.xpath("//span[not(contains(@title, '.'))]/text()").extract():
temp = i.strip().lstrip('\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t')
.rstrip('\r\n\t\t\t\t\t\t\t\t\t\t\t\t')
if isAllAlpha(temp):
wordList.append(temp)
这可能听起来有点傻,但到目前为止我找不到更好的方法。