Python RE在/ref之后不返回任何内容=

2024-06-11 04:18:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图检索的网址和类别名称从亚马逊的畅销书名单。出于某种原因,当RE遇到/ref=时,我正在使用stops,我真的不明白为什么?我正在Windows7上使用Python2.7。你知道吗

典型的记录是

<li><a href="http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_nav_0">Appstore for Android</a></li>

我的梦想是

Regex = "<li><a href='(http://www.amazon.ca/Best-Sellers.*?)'>(.*?)</a></li>"
Category = re.compile(Regex)

返回一个元组

[][0] http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps
[][1] Appstore for Android

我确实得到了所有正确的记录,但是正如您所看到的,URL缺少/ref=zg_bs_nav_0。你知道吗

category层次结构中的其他级别也存在同样的问题;URL中以/ref=开始并包括/ref=的所有内容都丢失了。你知道吗

这是我接受Martijn建议后的代码片段

# First page of the list of Best Sellers categories
URL = "http://www.amazon.ca/gp/bestsellers"

# Retrieve the page source
HTMLFile = urllib.urlopen(URL)
HTMLText = HTMLFile.read()

soup = BeautifulSoup(HTMLText)
for link in soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]'):
    print link['href']
    print link.get_text()

Tags: refhttpurlamazonforwww记录link
1条回答
网友
1楼 · 发布于 2024-06-11 04:18:54

您使用的是正则表达式,但将XML与此类表达式匹配会变得太复杂、太快。别那么做。你知道吗

相反,使用HTML解析器,Python可以从以下几个方面进行选择:

  • ElementTree是标准库的一部分
  • BeautifulSoup是一个流行的第三方库
  • lxml是一个快速且功能丰富的基于C的库。你知道吗

后两种方法也能很好地处理格式错误的HTML,使许多拙劣的网站变得有意义。事实上,如果安装了beautifulsoup4,它会使用lxml作为解析器。你知道吗

BeautifulSoup示例:

from bs4 import BeautifulSoup

soup = BeautifulSoup(htmlsource)
for link in soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]'):
    print link['href'], link.get_text()

这使用CSS选择器来查找直接包含在<li>元素中的所有<a>元素,其中href属性以文本http://www.amazon.ca/Best-Sellers开头。你知道吗

演示:

>>> from bs4 import BeautifulSoup
>>> htmlsource = '<li><a href="http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_nav_0">Appstore for Android</a></li>'
>>> soup = BeautifulSoup(htmlsource)
>>> for link in soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]'):
...     print link['href'], link.get_text()
... 
http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_nav_0 Appstore for Android

请注意,Amazon会根据标题更改响应:

>>> import requests
>>> from bs4 import BeautifulSoup
>>> r = requests.get('http://www.amazon.ca/gp/bestsellers')
>>> soup = BeautifulSoup(r.content)
>>> soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]')[0]
<a href="http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps">Appstore for Android</a>
>>> r = requests.get('http://www.amazon.ca/gp/bestsellers', headers={
...     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36'})
>>> soup = BeautifulSoup(r.content)
>>> soup.select('li > a[href^=http://www.amazon.ca/Best-Sellers]')[0]
<a href="http://www.amazon.ca/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_nav_0/185-3312534-9864113">Appstore for Android</a>

相关问题 更多 >