正在解析 python 中的某个网页

Parsing a certain webpage in python

我试图在两个特定标签之间拆分 "href" 的每个实例。 具体来说,这是我正在处理的内容: `

req = urllib2.Request('http://tv1.alarab.com/')
response = urllib2.urlopen(req)
link = response.read()
target = re.findall(r'<div id="nav">(.*?)</div>', link, re.DOTALL)
for items in target:
    mypath = items.split(' href="/')[1].split('/')[0]
    print mypath

这是它打印出来的内容:

view-5553

它只打印第一个实例。 在另一个网站上,我使用完全相同的方法,它在遇到 "href"

时打印所有实例

这是我为另一个网站准备的:

req = urllib2.Request('http://www.shahidlive.co')
response = urllib2.urlopen(req)
link = response.read()
target = re.findall(r'<ul class="hidden-xs">(.*?)</ul>', link, re.DOTALL)
for items in target:
    mypath = items.split('href="')[1].split('">')[0]
    print mypath

这是打印出来的内容,这基本上就是我希望第一段代码打印出来的内容:

/Album-1104708-1/
/Cat-134-1
/Cat-100-1
/Album-1104855-1/
/Cat-121-1

我尝试了 运行 调试器,for 循环似乎只为第一个网站迭代一次。我不确定为什么或发生了什么。任何帮助将不胜感激。

首先,使用正则表达式解析 XML/HTML/JSON 等结构化数据是一个 极端 坏主意 - 在您的示例中,如果有这样的结构:

<div id="nav">
    <div>
        <span>whatever</span>
    </div>
    <a href="http://some.link/path">this is the link you want</a>
</div>

你会得到一个 diddly-squat,因为由于非贪婪限定符,正则表达式将在第一次 </div> 出现时结束。另一方面,如果它是贪婪的,你会忽略任何其他 <div id="nav"> 实例(这在 HTML 中应该是非法的,但脚本小子很长一段时间都破坏了 HTML以前所以现在什么都行,但我离题了...)。

但是,在您的特定情况下,问题实际上出在您的内部拆分逻辑上 - 您的正则表达式将捕获一个组(因为页面上只有一个 <div id="nav">,所以它将捕获所有内容,直到第一个</div> 标签):

<div id="nav">
<ul id="navbar">
        <li  id="d5553"><a title="..." href="/view-5553/">...</a></li><li  id="d1"><a title="..." href="/view-1/">...</a></li><li  id="d295"><a title="..." href="/view-295/">...</a></li><li  id="d6181"><a title="..." href="/view-6181/">...</a></li><li  id="d297"><a title="..." href="/view-297/">...</a></li><li  id="d311"><a title="..." href="/view-311/">...</a></li><li id="d5807"><a title="" href="/view-5807/">...</a></li><li  id="d10"><a title="..." href="/view-10/">...</a></li><li  id="d313"><a title="..." href="/view-313/">...</a></li><li  id="d1951"><a title="..." href="/view-1951/">...</a></li><li  id="d299"><a title="..." href="/view-299/">...</a></li><li  id="d8"><a title="..." href="/view-8/">...</a></li><li  id="d4"><a title="..." href="/view-4/">...</a></li><li  id="d309"><a title="..." href="/view-309/">...</a></li><li  id="d5573"><a title="..." href="/view-5573/">...</a></li>        
</ul>

</div>

(为了便于阅读,我用 ... 替换了波浪形的东西)

因此,当您对其调用 split() 例程时,您只会获得一个值 - 第一个 view-5553。如果您想捕获该块中的其余 href 值,您必须在 href="/ 上拆分并遍历列表以获取单个条目(在第一个下一个 " 处结束),或者您也可以使用正则表达式:

mypath = re.findall(r' href="/(.*?)/?"', items)
# ['view-5553', 'view-1', 'view-295', 'view-6181', 'view-297', 'view-311', 'view-5807',
# 'view-10', 'view-313', 'view-1951', 'view-299', 'view-8', 'view-4', 'view-309',
# 'view-5573']

(这是我的替换,你的实际代码会给你实际的链接)。

再说一遍 - 正则表达式不是 HTML 解析的正确工具,为自己省去一些麻烦,至少使用 BeautifulSoup.