在python中打印列表中的所有项时出现问题

2024-09-28 22:00:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力学习如何做网页抓取,但它并没有以我希望的格式出现。以下是我遇到的问题:

import urllib
import re

pagelist = ["page=1","page=2","page=3","page=4","page=5","page=6","page=7","page=8","page=9","page=10"]
ziplocations = ["=30008","=30009"]

i=0
while i<len(pagelist):
    url = "http://www.boostmobile.com/stores/?" +pagelist[i]+"&zipcode=30008"
    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()
    regex = '<h2 style="float:left;">(.+?)</h2>' 
    pattern = re.compile(regex)
    storeName = re.findall(pattern,htmltext)
    print "Store Name=", storeName[i]
    i+=1

此代码生成以下结果: Store Name=Boost Mobile Store by wireless仓库 商店名称=沃尔玛 ..... 所以对于10家不同的商店,我假设这是因为

while i<len(pagelist):

只等于十

所以它只打印出10个商店,而不是所有页面上列出的所有商店。你知道吗

当我把第二行改成最后一行的时候

print storeName

它将打印出每页上列出的每个商店名称,但不是采用上述格式,而是如下所示: “Boost mobile store by wireless depot”、“Boost mobile store by kob wireless”、“marietta check chashing services”,。。。。。以此类推,大约还有120个条目。 那么,如何将其转换为所需的格式:“Store Name=…..”而不是“Name”、“Name”,。。。。。你知道吗


Tags: storenameimportrebylen格式page
2条回答

storeName是一个数组,需要循环遍历它。目前,您在每一页上都使用页码对其进行索引,这可能不是您的意图。你知道吗

下面是代码的正确版本,添加了循环。你知道吗

import urllib
import re

pagelist = ["page=1","page=2","page=3","page=4","page=5","page=6","page=7","page=8","page=9","page=10"]
ziplocations = ["=30008","=30009"]

i=0
while i<len(pagelist):
    url = "http://www.boostmobile.com/stores/?" +pagelist[i]+"&zipcode=30008"
    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()
    regex = '<h2 style="float:left;">(.+?)</h2>' 
    pattern = re.compile(regex)
    storeName = re.findall(pattern,htmltext)
    for sn in storeName:
        print "Store Name=", sn
    i+=1

Do not parse HTML with regex.使用一个专门的工具-anHTML Parser。你知道吗

下面是使用^{}的解决方案:

import urllib2
from bs4 import BeautifulSoup

base_url = "http://www.boostmobile.com/stores/?page={page}&zipcode={zipcode}"
num_pages = 10
zipcode = 30008

for page in xrange(1, num_pages + 1):
    url = base_url.format(page=page, zipcode=zipcode)
    soup = BeautifulSoup(urllib2.urlopen(url))

    print "Page Number: %s" % page
    results = soup.find('table', class_="results")
    for h2 in results.find_all('h2'):
        print h2.text

它打印:

Page Number: 1
Boost Mobile Store by Wireless Depot
Boost Mobile Store by KOB Wireless
Marietta Check Cashing Services
...
Page Number: 2
Target
Wal-Mart
...

如您所见,首先我们找到一个带有results类的table标记—这就是商店名称的实际位置。然后,在table中我们找到了所有的h2标记。这比依赖标签的style属性更健壮。你知道吗


您还可以使用^{}。它将提高性能,因为它只解析您指定的文档部分:

required_part = SoupStrainer('table', class_="results")
for page in xrange(1, num_pages + 1):
    url = base_url.format(page=page, zipcode=zipcode)
    soup = BeautifulSoup(urllib2.urlopen(url), parse_only=required_part)

    print "Page Number: %s" % page
    for h2 in soup.find_all('h2'):
        print h2.text

这里我们说:“只解析带有类resultstable标记。把里面的h2标签都给我们。”

另外,如果要提高性能,可以let ^{} use ^{} parser under the hood

soup = BeautifulSoup(urllib2.urlopen(url), "lxml", parse_only=required_part) 

希望有帮助。你知道吗

相关问题 更多 >