2016-01-14 113 views
0

所以我试图匹配使用Python和正则表达式在亚马逊项目页中的货币字符串。Python的正则表达式不匹配所有的字符串

我当前的代码,因为它代表:

import csv 
import requests as rq 
import re 
import lxml 
from bs4 import BeautifulSoup as bs 

i = 0 
urls = csv.reader(open('/Users/Fuck/Documents/Amazon/HTML_Parsetest/urls.csv')) 
for url in urls: 
    r=rq.get(url[0],stream=True) 
    for chunk in r.iter_content(chunk_size=2048): 
     if chunk: 
      data = chunk 
      soup=bs(data, "lxml") 
      elem=soup.find_all('td',attrs={'class':'a-text-right dp-used-col'}) 
      print(elem) 
      if elem!=[]: 
       i = i + 1 
       s=re.findall('(\£\d+\.\d+)+',str(elem[0])) 
       print (i,"Price:", s[0].split()[0]) 

当前打印出从first url

[<td class="a-text-right dp-used-col"> 
<a class="a-link-normal" href="/gp/offer-listing/019859660X/ref=tmm_hrd_used_olp_0?ie=UTF8&amp;condition=used&amp;qid=&amp;sr="> 
<span>£51.70</span> 
</a> 
</td>] 
1 Price: £51.70 
[<td class="a-text-right dp-used-col"> 
<a class="a-link-normal" href="/gp/offer-listing/0198596790/ref=tmm_pap_used_olp_sr?ie=UTF8&amp;condition=used&amp;qid=&amp;sr="> 
<span>£35.15</span> 
</a> 
</td>] 
2 Price: £35.15 

second url打印出来:

[<td class="a-text-right dp-used-col"> 
<a class="a-link-normal" href="/gp/offer-listing/0521254167/ref=tmm_hrd_used_olp_0?ie=UTF8&amp;condition=used&amp;qid=&amp;sr="> 
<span>£355.37</span> 
</a> 
</td>, <td class="a-text-right dp-used-col"> 
<a class="a-link-normal" href="/gp/offer-listing/0521274249/ref=tmm_pap_used_olp_sr?ie=UTF8&amp;condition=used&amp;qid=&amp;sr="> 
<span>£29.93</span> 
</a> 
</td>] 
3 Price: £355.37 

在第二url运行,它发现整个TD块作为一个实体,而在第一个我吨发现他们作为单独的块,我不知道为什么。 所以看来我的正则表达式只会在每个块中找到一个字符串实例。

如何在第二个网址找到两个字符串£355.37和£29.93?

+0

我发现[在线正则表达式测试仪(https://regex101.com/)通常是有帮助的 – miraculixx

+0

@miraculixx正则表达式似乎是罚款。 – taleinat

+0

价格总是以'£'为单位吗? –

回答

0

首先,你不应该在这里使用iter_content(),因为这意味着你解析HTML的一部分而不是整个文档。 BeautifulSoup可能会设法抽出一些东西,但是如果不知道,你会错过很多内容。

除此之外,您在搜索时已经使用soup.findall()re.finall(),但您只查看每个匹配的第一个匹配项。迭代这两者的结果,你应该看到所有的结果。

当然,还有很多其他问题。例如,价格可能不会在HTML写的所有,或不写的正是你所搜索的格式,或者您是通过搜索标签没有找到,

祝你好运!

0
s=re.findall('(\£\d+\.\d+)+',str(elem[0])) 

这将返回一个字符串列表,您可以迭代,因此s[1]应该有第二个价格。

我不认为解析原始HTML是虽然提取这些价格是一个好主意,亚马逊可以在任何时候决定更改HTML/CSS/JS和代码将打破。你应该在自己的Web服务来看一看:

http://docs.aws.amazon.com/AWSECommerceService/latest/DG/EX_RetrievingPriceInformation.html

+0

感谢您的答复,我目前正在研究使用博托,因为它可以更容易比这个。 –

相关问题