如何在xpath中使用matches函数提取英文单词

1 投票
3 回答
962 浏览
提问于 2025-04-18 06:07

我对 scrapypython 完全是个新手。请问我怎么用 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 函数是有效的。顺便说一下,我用 xpathcontains 函数也能正常工作。

这是我使用 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 个回答

0

我自己对这个也不是很熟,但我查了不少资料关于使用Scrapy,我觉得我可以帮你解释一下代码的意思:

return [item for item in items if re.match('[a-z]$', item.strip('\t\n\r')]

这里的re是“正则表达式”(RegEx)的缩写,所以后面跟着的[a-z]$就是一个正则表达式,用来匹配:这基本上是说任何一个英文字母,也就是从az的字母。

我最熟悉的正则表达式是在Apache中使用的,那里$表示字符串的结尾,但在这里我不太确定,看起来更像是用作通配符。

items.strip的意思是“要去掉的项”,而且它是用来处理空白字符的正则表达式(在ASCII中,我想...我不太确定,但我知道这和文档的编码以及正则表达式如何解析和匹配有关)。

\n表示“换行”。

我猜\t是“制表符”,而\r可能是“回车”(或者也可能是“空格”)。

这个规则可能是为了确保Unix风格的行结束符(源文件中的)\n和Windows风格的行结束符,我想是\n\r

所以如果解释的话,我觉得这段代码实际上是在说……

“为数组中的每一项生成一个符合以下条件的项:它们包含从az的任何英文字母,并忽略‘换行’、‘制表符’和‘回车’这些字符。”

我还怀疑ii.strip中是“忽略大小写”的缩写,意思是匹配大写和小写字母。

0

你能试试这段代码吗?

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()
0

经过一些研究,我发现了这个页面。我正在使用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)

这可能听起来有点傻,但到目前为止我找不到更好的方法。

撰写回答