我正在尝试使用正则表达式解析scrapy结果,这是我在MySQL表中的正则表达式模式..我无法按顺序循环模式以便返回没有任何html标签的干净内容.. 简单地说html result scrapy - >用row1中的模式解析(例如:清除html上面的内容),用row2中的模式解析(在内容下面清除html),..... - >清洁
例如
<body>
<title>
<some tags>
<content>
<footer tags>
<another tags>
</body>
我正在尝试使用此表,字段名称(模式,序列,替换器),值来清除该html:
row1 <body.*?some tags> 1 None
row2 <footer.*?/body> 2 None
row3 <br> 3 Enter
row4 #" 4 ""
所以我有一个干净的内容作为回报,我正在使用正则表达式替换模式,而不是xpath匹配,因为我希望用他们自己的html标签变化废弃大量的网页
这是我的代码,它没有引发错误,但结果重复..它应该是1个scrapy结果的1个干净的结果。我认为我做错了什么,但由于我是python和scrapy的新手,所以无法解决这个问题
def parse(self, response):
for mbuh in response.xpath('//body'):
Item = ParsingerbotItem()
Item['ling'] = str(response.url)
ngaliase = re.findall("\w+.com", str(response.url))[0]
mmhtml = mbuh.xpath('//body').extract()
cur.execute("select aliase, pattern, seq, opsi, replacer from tb_bersihin where aliase='"+ngaliase+"\' order by seq asc")
for filde in cur.fetchall():
faliase = filde[0]
fpattern = filde[1]
fseq = filde[2]
fopsi = filde[3]
freplacer = filde[4]
print "faliase=%s,fpattern=%s,furutan=%d,fopsi=%s,freplacer=%s" % \
(faliase, fpattern, fseq, fopsi, freplacer )
if ( freplacer == "NO" ) : freplacer=""
if ( fopsi == "NL" ) : fopsi="re.DOTALL"
k1 = re.sub(fpattern , freplacer, str(mmhtml), re.DOTALL)
print k1
提前谢谢
答案 0 :(得分:1)
@insecte,看看this漂亮的小蜘蛛。它读取this CSV文件,并从页面进行常规解析。使用此作为起点,并使用数据库读数更改CSV文件读数。您很可能不会拥有1000个URL,因此只需从数据库中读取一次并将XPath表达式存储在内存中。这有帮助吗?
答案 1 :(得分:0)
你的循环for mbuh in response.xpath('//body')
只执行一次,因为xpath只返回一个选择器。然后你使用mmhtml = mbuh.xpath(etc)
,它总是会返回相同的数据,无论mbuh是什么,因为xpath以'//'开头,这意味着'从页面的开头搜索'。它还将整个页面作为文本提取。
我明白为什么你在cur.fetchall上循环,但为什么你在mbuh = response.xpath()上循环?你期望xpath返回什么?
答案 2 :(得分:0)
我认为我解决了自己的问题,也许我不擅长描述上面的问题,但我想要的是将第一个模式的结果作为第二个模式的主题,然后继续下一个模式来自mysql表的模式..
我所做的只是改变了
k1 = re.sub(fpattern , freplacer, str(mmhtml), re.DOTALL)
到
k1 = re.sub(fpattern , freplacer, k1)
并在循环k1 = str(mmhtml)
cur.fetchall()
谢谢