Python 如何使用xpath中的matches函数提取英语单词

Python 如何使用xpath中的matches函数提取英语单词,python,regex,xpath,scrapy,Python,Regex,Xpath,Scrapy,我是scrapy和python的新手。如何使用xpath提取英语单词 以下是HTML页面的一个片段: <span title="vacant"> vacant </span> <span title="linen"> linen </span> 更新2: 实际上我是在抓取一本英汉词典,首先,我想提取一个英文单词(一个随机单词),上面列出了HTML源代码,其次,我想提取对应于英文单词的中文释义,HTML源代码如下: <span title

我是
scrapy
python
的新手。如何使用
xpath
提取英语单词

以下是
HTML
页面的一个片段:

<span title="vacant">
vacant
</span>


<span title="linen">
linen
</span>
更新2:

实际上我是在抓取一本英汉词典,首先,我想提取一个英文单词(一个随机单词),上面列出了HTML源代码,其次,我想提取对应于英文单词的中文释义,HTML源代码如下:

<span title="adj. [Chinese paraphrase of vacant]" style="display:block;">
adj. [Chinese paraphrase of vacant]
</span>
你能试试这个代码吗

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

经过一些研究,我发现了这个。我使用的是只支持xpath 1.0的
scrapy 0.22.2
,您可以参考其中不支持的
匹配
函数。所以我必须在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)

这可能很愚蠢,但到目前为止,我还没有找到更好的方法。

我自己对这一点还比较陌生,但我已经做了大量的使用研究,我想我可以帮助澄清一些发布的代码:

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

re.match
中的
re
是正则表达式RegEx的简写形式),这就是为什么后面跟着要匹配的正则表达式:
[a-z]$
(这基本上意味着英语字母表中的任何字母——从a到z的任何字母)

我最熟悉Apache的RegEx,其中
$
表示字符串的结尾,但我不确定,它看起来更像是用作通配符

items.strip
说的是“要删除的项”,是用于空格的正则表达式(我想,在ASCII中……我不确定,但我知道它与文档的编码以及正则表达式如何解析和匹配有关)

\n
是一个“新行”

我猜
\t
是“tab”,我想
\r
是“return”(或者可能是“space”)

该规则可能会确保(源文件的)Unix样式的行尾
\n
和Windows样式的行尾,我认为它们是
\n\r

所以,如果解释的话,我认为代码实际上是在说

“为符合以下条件的数组中的每个项目生成1个项目:它们包含从az的任何英文字母,并忽略“新行”、“制表符”和“返回”的字符”


我还怀疑
I.strip
中的
I
是“不区分大小写”的缩写,意思是匹配大小写字母。

这个例外可能是“未注册函数”吗?请注意,包含完整的错误总是好的。。。不仅仅是我总是在上面的句子中出现synattax错误——这并不能帮助任何人诊断问题可能是什么。最终目标是什么?只提取带有单个单词标题的跨距还是@对不起,我没有包括错误消息。因为我觉得这可能是个简单的问题。实际上,字段中只有一个英语单词,如果“title”等于一个有效的英语单词,那么字段的文本就是我想要的单词。最终目标是提取欲望这个词。无论如何,我明天会更新我的问题。谢谢。您需要一个包含英语单词的单词列表来匹配它们和一个很长的XPath表达式。代码告诉我的是,您希望只使用字母数字字符匹配文本。您可能想重新表述您的问题。@ArtjomB。谢谢,我再次更新了我的问题。@JonClements你说得对,
matches
函数在
xpath 1.0
中不受支持。谢谢谢谢,但我觉得这对我来说不起作用。我的问题是要弄清楚为什么“匹配”函数一开始就不起作用。现在,经过一些研究,“scrapy”中的“xpath”版本似乎是1.0,其中不支持“matches”函数。因此,我必须在python级别处理它。需要注意的是:
temp=I.strip()
就是您所需要的。。。这将删除两端的所有空白。。。如果您只需要一个子集(例如不包括空格),那么
temp=i.strip('\r\n\t')
就足够了……您的
isAllAlpha
似乎没有必要,Python有一个内置的字符串来处理它:
如果'Alan'。isalpha():
如果'123'。isalpha()例如,这将有助于整理您的代码anyway@JonClements感谢您的注释,
strip('\r\n\t')
工作得很好。但是,
isaplha
在我的情况下不起作用,因为我必须处理一些中文单词(以
unicode
的形式),正如您所知,
unicode
对象没有属性
isaplha
。将所有内容合并为一个:
items=xpath(//span[not(contains(@title,'))]/text())。extract();return[item for items in items if re.match('[a-z]$',item.strip('\t\n\r')]
请回答这个问题,并稍微解释一下您的代码,我不太理解这行
return[item for items in items if re.match('[a-z]$',item.strip('\t\n\r')]].
。作为一个python新手,这行
return[…]
对我来说很奇怪,返回一个…?还有什么是
re
?谢谢
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()
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)