正在解析 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
.
我试图在两个特定标签之间拆分 "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
.