所以我试图使用Python和regex匹配亚马逊项目页面中的货币字符串。
我目前的代码:
$this->db->select("product_name")
->from('sale_items')
->where('sale_items.sale_id',4221);
$q1 = $this->db->get();
if ($q1->num_rows() > 0) {
foreach (($q1->result_array()) as $row1) {
$prdtarray[] = $row1['product_name'];
}
$product=implode(',',$prdtarray);
echo $product ;
当前打印出first url:
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])
从second 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&condition=used&qid=&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&condition=used&qid=&sr=">
<span>£35.15</span>
</a>
</td>]
2 Price: £35.15
在第二个url运行中,它将整个td块视为一个实体,而在第一个中它将它们作为单独的块找到,我无法解决原因。 所以看起来我的正则表达式只会在每个块中找到一个字符串实例。
如何在第二个网址中找到这些字符串£355.37和£29.93?
答案 0 :(得分:0)
首先,你不应该在这里使用iter_content()
,因为这意味着你要解析部分HTML而不是整个文档。 BeautifulSoup可能会设法提取一些东西,但是如果不知道的话,你会遗漏很多内容。
除此之外,您在搜索时已经使用soup.findall()
和re.finall()
,但您只是查看每个匹配项的第一场比赛。迭代这两个结果,你应该看到所有的结果。
当然,可能还有很多其他问题。例如,价格可能根本不是用HTML编写的,或者不是以您正在搜索的格式编写的,或者在您搜索的标签中找不到...
祝你好运!答案 1 :(得分:0)
s=re.findall('(\£\d+\.\d+)+',str(elem[0]))
这将返回一个您可以迭代的字符串列表,以便s[1]
具有第二个价格。
我不认为解析原始html是提取这些价格的好主意,亚马逊可能会决定随时更改html / css / js并且代码会中断。你应该看看他们的网络服务:
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/EX_RetrievingPriceInformation.html