3

クラスでは、特定の Web ページ上の画像の数を数える必要がある演習があります。すべての画像が で始まることを知っているので、正規表現を使用してそれらを見つけようとしています。しかし、私は間違っているとわかっているものの数を数え続けています。コードの何が問題なのですか:

import urllib
import urllib.request
import re
img_pat = re.compile('<img.*>',re.I)

def get_img_cnt(url):
  try:
      w =  urllib.request.urlopen(url)
  except IOError:
      sys.stderr.write("Couldn't connect to %s " % url)
      sys.exit(1)
  contents =  str(w.read())
  img_num = len(img_pat.findall(contents))
  return (img_num)

print (get_img_cnt('http://www.americascup.com/en/schedules/races'))
4

3 に答える 3

10

HTML の解析に正規表現を使用しないでください。 lxmlBeautifulSoupなどの html パーサーを使用してください。およびrequestsimgを使用してタグ数を取得する方法の実際の例を次に示します。BeautifulSoup

from bs4 import BeautifulSoup
import requests


def get_img_cnt(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content)

    return len(soup.find_all('img'))


print(get_img_cnt('http://www.americascup.com/en/schedules/races'))

lxmlとを使用した実際の例を次に示しrequestsます。

from lxml import etree
import requests


def get_img_cnt(url):
    response = requests.get(url)
    parser = etree.HTMLParser()
    root = etree.fromstring(response.content, parser=parser)

    return int(root.xpath('count(//img)'))


print(get_img_cnt('http://www.americascup.com/en/schedules/races'))

両方のスニペットが印刷されます106

以下も参照してください。

それが役立つことを願っています。

于 2013-08-18T19:59:49.853 に答える
2

ああ、正規表現。

あなたの正規表現パターン<img.*>は、「で始まるものを見つけて、<imgで終わることを確認して>ください.

ただし、正規表現は貪欲です。パターンを満たすために後でどこかに.*単一の文字を残しながら、文字通りそれができるすべてのものでそれを埋めます。>この場合は、最後まで<html>表示され、「ほら、あそこに見つけた!」と表示されます>

.*次のように、非貪欲にすることで、正しいカウントを考え出す必要があります。

<img.*?>

于 2013-08-18T20:02:42.310 に答える
1

あなたの正規表現は貪欲であるため、必要以上に一致します。HTML パーサーを使用することをお勧めします。

img_pat = re.compile('<img.*?>',re.I)正規表現の方法で行う必要がある場合は、トリックを行います。?貪欲ではありません。

于 2013-08-18T19:58:31.623 に答える