我正在刮一个网页,它在html标签中不使用任何有用的类或in,所以我不得不放弃所有的链接,并在链接中寻找模式。下面是示例html的外观
<span>Category</span><link href='example.com/link-about-a'>A</a>
在另一页上,我们可能有不同的类别。
<span>Category</span><link href='example.com/link-about-b'>B</a>
使用beautifulsoup4,我的当前解决方案如下所示
def category(soup):
for x in soup.find_all('a'):
if 'link-about-a' in x['href']:
return 'A'
if 'link-about-b' in x['href']:
return 'B'
以此类推。但这很难看。
我想知道是否有办法使这件事不那么冗长。
就像用字典
categories = {'A': 'link-about-a', 'B': 'link-about-b'}
并将其简化为一个表达式。
发布于 2014-01-12 18:15:53
您所需要的只是另一个循环:
for x in soup.find_all('a'):
for k, v in categories.iteritems():
if v in x['href']:
return k
尽管如果您想要一个单独的表达式:
category = next((
k for x in soup.find_all('a')
for k, v in categories.iteritems()
if v in x['href']
), None)
发布于 2014-01-12 19:21:43
使用正则表达式和类别列表可能要灵活一些:
categories = [[re.compile('link-about-a'), 'A'],
[re.compile('link-about-b'), 'B']]
def category(soup):
for x in soup.findAll('a'):
for expression, description in categories:
if expression.search(x['href']):
return description
else:
return None
https://stackoverflow.com/questions/21082853
复制