如何使用python从MySql表循环解析模式

时间:2016-06-08 03:22:09

标签: python mysql regex scrapy

我正在尝试使用正则表达式解析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    #&quot              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

提前谢谢

3 个答案:

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

谢谢