簡體   English   中英

無法打印python中列表中的所有項目

[英]Trouble printing all items from a list in 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 depot Store Name = Wal-Mart .....等10個不同的商店,我假設這是因為

while i<len(pagelist):

只有=到十

所以它只打印出十個商店而不是所有頁面上列出的所有商店。

當我將第二行更改為最后一行時

print storeName

它將打印出每個頁面上列出的每個商店名稱,但不是上面的格式,但是像這樣:'通過無線倉庫提升移動商店','通過kob wireless提升移動商店','marietta check chashing services',....等等約120個條目。 所以我如何得到所需的格式:“Store Name = ....”而不是:'name','name',.....

不要使用正則表達式解析HTML。 使用專門的工具 - HTML Parser

以下是使用BeautifulSoup的解決方案:

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屬性更強大。


您也可以使用SoupStrainer 它會提高性能,因為它只解析您指定的文檔部分:

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

這里我們說:“只用table results解析table標簽。然后給我們里面的所有h2標簽。”

此外,如果您想提高性能,可以BeautifulSoup使用lxml解析器

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

希望有所幫助。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM