1

現在BeautifulSoupを使用して解析しているWebページがありますが、非常に遅いので、非常に高速であると読んだので、lxmlを試すことにしました。

とにかく、コードを必要なセクションで反復処理するのに苦労しています。lxmlの使用方法がわからず、明確なドキュメントが見つかりません。

とにかく、ここに私のコードがあります:

import urllib, urllib2
from lxml import etree

def wgetUrl(target):
    try:
        req = urllib2.Request(target)
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3 Gecko/2008092417 Firefox/3.0.3')
        response = urllib2.urlopen(req)
        outtxt = response.read()
        response.close()
    except:
        return ''
    return outtxt

newUrl = 'http://www.tv3.ie/3player'

data = wgetUrl(newUrl)
parser = etree.HTMLParser()
tree   = etree.fromstring(data, parser)

for elem in tree.iter("div"):
    print elem.tag, elem.attrib, elem.text

これはすべてのDIVを返しますが、dev id ='slider1'のみを反復するように指定するにはどうすればよいですか?

div {'style': 'position: relative;', 'id': 'slider1'} None

これは動作しません:

for elem in tree.iter("slider1"):

これはおそらくばかげた質問だと思いますが、理解できません。

ありがとう!

*編集**

このコードを追加することで、以下の出力が得られます。

for elem in tree.xpath("//div[@id='slider1']//div[@id='gridshow']"):
    print elem[0].tag, elem[0].attrib, elem[0].text
    print elem[1].tag, elem[1].attrib, elem[1].text
    print elem[2].tag, elem[2].attrib, elem[2].text
    print elem[3].tag, elem[3].attrib, elem[3].text
    print elem[4].tag, elem[4].attrib, elem[4].text

出力:

a {'href': '/3player/show/392/57922/1/Tallafornia', 'title': '3player | Tallafornia, 11/01/2013. The Tallafornia crew are back, living in a beachside villa in Santa Ponsa, Majorca. As the crew settle in, the egos grow bigger than ever and cause tension'} None
h3 {} None
span {'id': 'gridcaption'} The Tallafornia crew are back, living in a beachside vill...
span {'id': 'griddate'} 11/01/2013
span {'id': 'gridduration'} 00:27:52

それはすべて素晴らしいですが、上のタグの一部が欠落しています。パーサーはコードを正しく処理していませんか?

私は以下を取得していません:

<img alt="3player | Tallafornia, 11/01/2013. The Tallafornia crew are back, living in a beachside villa in Santa Ponsa, Majorca. As the crew settle in, the egos grow bigger than ever and cause tension" src='http://content.tv3.ie/content/videos/0378/tallaforniaep2_fri11jan2013_3player_1_57922_180x102.jpg' class='shadow smallroundcorner'></img>

なぜそれがこれを引っ張らないのか、何か考えはありますか?

もう一度ありがとう、非常に役立つ投稿..

4

2 に答える 2

2

XPath式は次のように使用できます。

for elem in tree.xpath("//div[@id='slider1']"):

例:

>>> import urllib2
>>> import lxml.etree
>>> url = 'http://www.tv3.ie/3player'
>>> data = urllib2.urlopen(url)
>>> parser = lxml.etree.HTMLParser()
>>> tree = lxml.etree.parse(data,parser)
>>> elem = tree.xpath("//div[@id='slider1']")
>>> elem[0].attrib
{'style': 'position: relative;', 'id': 'slider1'}

処理しているページのコンテンツをより適切に分析する必要があります(これを行うための良い方法は、FirefoxアドオンでFirefoxを使用することです)。

取得しようとしているタグ<img>は、実際には<a>タグの子です。

>>> for elem in tree.xpath("//div[@id='slider1']//div[@id='gridshow']"):
...    for elem_a in elem.xpath("./a"):
...       for elem_img in elem_a.xpath("./img"):
...          print '<A> HREF=%s'%(elem_a.attrib['href'])
...          print '<IMG> ALT="%s"'%(elem_img.attrib['alt'])
<A> HREF=/3player/show/392/58784/1/Tallafornia
<IMG> ALT="3player | Tallafornia, 01/02/2013. A fresh romance blossoms in the Tallafornia house. Marc challenges Cormac to a 'bench off' in the gym"
<A> HREF=/3player/show/46/58765/1/Coronation-Street
<IMG> ALT="3player | Coronation Street, 01/02/2013. Tyrone bumps into Kirsty in the street and tries to take Ruby from her pram"
../..
于 2013-02-01T20:31:24.150 に答える
0

これが私が自分でそれを機能させる方法です、これが最良のアプローチであるかどうかはわかりませんので、コメントを歓迎します:

import urllib2, re
from lxml import etree
from datetime import datetime

def wgetUrl(target):
    try:
        req = urllib2.Request(target)
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3 Gecko/2008092417 Firefox/3.0.3')
        response = urllib2.urlopen(req)
        outtxt = response.read()
        response.close()
    except:
        return ''
    return outtxt

start = datetime.now()

newUrl = 'http://www.tv3.ie/3player' # homepage

data = wgetUrl(newUrl)
parser = etree.HTMLParser()
tree   = etree.fromstring(data, parser)

for elem in tree.xpath("//div[@id='slider1']//div[@id='gridshow'] | //div[@id='slider1']//div[@id='gridshow']//img[@class='shadow smallroundcorner']"):
    if elem.tag == 'img':
        img = elem.attrib.get('src')
        print 'img: ', img

    if elem.tag == 'div':
        show = elem[0].attrib.get('href')
        print 'show: ', show
        titleData = elem[0].attrib.get('title')

        match=re.search("3player\s+\|\s+(.+),\s+(\d\d/\d\d/\d\d\d\d)\.\s*(.*)", titleData) 
        title=match.group(1)
        print 'title: ', title

        description = match.group(3)
        print 'description: ', description

        date = elem[3].text
        duration = elem[4].text
        print 'date: ', date
        print 'duration: ', duration

end = datetime.now()
print 'time took was ', (end-start)

BeautifulSoupに期待していた大きな違いではありませんが、タイミングはかなり良いです。

于 2013-02-02T13:57:51.673 に答える