对lxml的scrapy响应选择器

对lxml的scrapy响应选择器,scrapy,lxml,Scrapy,Lxml,事实上,我详细阅读了这个问题。 但在我的项目中,有几十个爬虫程序使用scrapy选择器。将scrapy逐行转换为lxml将花费我们很多时间。因此,我尝试编写一些兼容的代码来迁移爬虫 class ElemList(列表): 定义初始化(self,元素列表=[]): 超级(ElemList,self)。\uuuu初始化(elem\u列表) def xpath(self,xpath_str=”“): res=[] 对于elem in self: 尝试: e=elem.xpath(xpath\u str

事实上,我详细阅读了这个问题。 但在我的项目中,有几十个爬虫程序使用scrapy选择器。将scrapy逐行转换为lxml将花费我们很多时间。因此,我尝试编写一些兼容的代码来迁移爬虫

class ElemList(列表):
定义初始化(self,元素列表=[]):
超级(ElemList,self)。\uuuu初始化(elem\u列表)
def xpath(self,xpath_str=”“):
res=[]
对于elem in self:
尝试:
e=elem.xpath(xpath\u str)
例外情况除外,如e:
持续
如果isinstance(e,str)或isinstance(e,unicode):
决议草案(e)
其他:
决议(e)
返回元素列表(res)
def提取(自):
res=[]
对于elem in self:
如果存在(元素、str):
res.append(elem)
返回res
在响应类中,添加一些init调用

从lxml导入etree
类响应(对象):
定义初始化(自):
self.elem_list=ElemList(etree.HTML(self.HTML))
def xpath(self,xpath):
返回self.elem_list.xpath(xpath)
使用这个类,我可以像这样调用响应对象:

resp.xpath('//h2[@class=“user card name”]/text()).extract()
resp.xpath('//h2[@class=“user card name”]').xpath('*[@class=“top badge”]/a/@href').extract()
它起作用了。但新的问题来了,我如何像这样迁移response.css

baseInfo\u div=response.css(“.vcard”)[0]
baseInfo_div.css(“.vcard全名”)
baseInfo_div.css(“.vcard用户名”)
baseInfo_div.css('li[itemprop=“worksFor”]”)
baseInfo_div.css('li[itemprop=“homeLocation”]”)

您可以尝试使用方法from实现您的逻辑,该方法使您能够使用CSS选择器表达式从
lxml
元素
对象进行查询。或者,您可以使用
GenericTranslator.CSS\u to_XPath()
将CSS选择器转换为XPath选择器:

从lxml导入html
h=html.fromstring(“”)
文本
''')
content=h.cssselect('div.content')[0]
content.text
#输出:
#“\n text\n”
从CSS选择导入GenericTranslator
GenericTranslator().css_to_xpath('div.content'))
#输出:
#u“后代或self::div[@class和contains(concat(“”,规范化空间(@class),“”),'content')”

有点离题,但为什么要使用lxml而不是scrapy选择器?我们决定不将scrapy用于爬虫程序,需要迁移我们的爬虫程序。您可以在不使用scrapy的情况下使用scrapy选择器。因此,您只需要更改导入。