首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将变量传递给:pyquery()选择器、pyquery/cssselect、error

将变量传递给:pyquery()选择器、pyquery/cssselect、error
EN

Stack Overflow用户
提问于 2015-11-30 14:39:18
回答 1查看 839关注 0票数 1

我使用pyquery来抓取一些数据,并希望迭代一些关键字,并结合匹配的正则表达式。

我尝试将键作为变量传递,但是我始终得到以下错误:

代码语言:javascript
复制
ExpressionError: Expected a single string for :contains(), got [<IDENT 'Trad' at 10>]

我以前从没见过这个..。

我在跑步:

代码语言:javascript
复制
user_type_regexes = {'Trad': rock_re, "Sport": rock_re, 
                 "Boulders": boulder_re, "Aid": aid_re, 
                 "Ice": ice_re, "Mixed": mixed_re}

user_diffs = user_main('table')

for key, value in zip(user_type_regexes.keys(), user_type_regexes.values()):
    if key != "Boulders":
        tdwithkey = user_diffs.find("tr").children(':contains(' + key + ')') 
  • 我已经测试了仅仅放置字符串而不是变量,并且代码运行良好。
  • 我还使用%s和{}.format进行了测试.任何帮助都将不胜感激!
  • 最后,在初始化循环时,我还使用了用户dict.items而不是奇怪的zip .

也就是说,在编写代码时,我得到了相同的错误,如下所示:

代码语言:javascript
复制
for key, value in user_type_regexes.items():
    if key != "Boulders":
        tdwithkey = user_diffs.find("tr").children(':contains({})'.format(key)) 

这是:

代码语言:javascript
复制
for key, value in user_type_regexes.items():
    if key != "Boulders":
        tdwithkey = user_diffs.find("tr").children(':contains(%s)' % key) 

完整的错误报告是:

代码语言:javascript
复制
ExpressionError                           Traceback (most recent call last)
<ipython-input-18-e159185e499d> in <module>()
 11 for key, value in zip(user_type_regexes.keys(), user_type_regexes.values()):
 12     if key != "Boulders":
---> 13         tdwithkey = user_diffs.find("tr").children(':contains(' + key + ')')
 14         leadhtml = tdwithkey.next().html()
 15         followhtml = tdwithkey.next().next().html()

C:\Users\nolefp\Anaconda\lib\site-packages\pyquery\pyquery.pyc in children(self, selector)
532         """
533         elements = [child for tag in self for child in tag.getchildren()]
--> 534         return self._filter_only(selector, elements)
535 
536     def closest(self, selector=None):

C:\Users\nolefp\Anaconda\lib\site-packages\pyquery\pyquery.pyc in _filter_only(self, selector, elements, reverse, unique)
413             results = elements
414         else:
--> 415             xpath = self._css_to_xpath(selector, 'self::')
416             results = []
417             for tag in elements:

C:\Users\nolefp\Anaconda\lib\site-packages\pyquery\pyquery.pyc in _css_to_xpath(self, selector, prefix)
247     def _css_to_xpath(self, selector, prefix='descendant-or-self::'):
248         selector = selector.replace('[@', '[')
--> 249         return self._translator.css_to_xpath(selector, prefix)
250 
251     def __call__(self, *args, **kwargs):

C:\Users\nolefp\Anaconda\lib\site-packages\cssselect\xpath.pyc in css_to_xpath(self, css, prefix)
190         return ' | '.join(self.selector_to_xpath(selector, prefix,
191                                                  translate_pseudo_elements=True)
--> 192                           for selector in parse(css))
193 
194     def selector_to_xpath(self, selector, prefix='descendant-or-self::',

C:\Users\nolefp\Anaconda\lib\site-packages\cssselect\xpath.pyc in <genexpr>((selector,))
190         return ' | '.join(self.selector_to_xpath(selector, prefix,
191                                                  translate_pseudo_elements=True)
--> 192                           for selector in parse(css))
193 
194     def selector_to_xpath(self, selector, prefix='descendant-or-self::',

C:\Users\nolefp\Anaconda\lib\site-packages\cssselect\xpath.pyc in selector_to_xpath(self, selector, prefix, translate_pseudo_elements)
217         if not tree:
218             raise TypeError('Expected a parsed selector, got %r' % (selector,))
--> 219         xpath = self.xpath(tree)
220         assert isinstance(xpath, self.xpathexpr_cls)  # help debug a missing 'return'
221         if translate_pseudo_elements and selector.pseudo_element:

C:\Users\nolefp\Anaconda\lib\site-packages\cssselect\xpath.pyc in xpath(self, parsed_selector)
252         if method is None:
253             raise ExpressionError('%s is not supported.' %  type_name)
--> 254         return method(parsed_selector)
255 
256 

C:\Users\nolefp\Anaconda\lib\site-packages\cssselect\xpath.pyc in xpath_function(self, function)
280             raise ExpressionError(
281                 "The pseudo-class :%s() is unknown" % function.name)
--> 282         return method(self.xpath(function.selector), function)
283 
284     def xpath_pseudo(self, pseudo):

C:\Users\nolefp\Anaconda\lib\site-packages\pyquery\cssselectpatch.pyc in xpath_contains_function(self, xpath, function)
415             raise ExpressionError(
416                 "Expected a single string for :contains(), got %r" % (
--> 417                     function.arguments,))
418 
419         value = self.xpath_literal(function.arguments[0].value)

ExpressionError: Expected a single string for :contains(), got [<IDENT 'Trad' at 10>]
EN

回答 1

Stack Overflow用户

发布于 2015-11-30 17:05:58

我的一个朋友发现了这一点,我不得不显式地添加括号,表示字符串:

代码语言:javascript
复制
"td:contains('{}')".format(key)

疯了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34001136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档