我在将ID与正确的帐户匹配时遇到了一个小问题: HTML代码如下所示:
<a href="javascript:UserWindow('Mike','14','0','27s', 'profile')">
<a href="user.php?id=14">Mike</a>
当我运行时:
IDs = re.findall('(?<=user.php\?id=)\w+(?=\">)', src)
names = re.findall('(?<=UserWindow\(\')\w+(?=\',\')', src)
例如Mike有ID 11而不是14.我该如何解决这个问题?
答案 0 :(得分:4)
你应该使用正确的html解析器,例如beautifulsoup:
import bs4
html = """<a href="javascript:UserWindow('Mike','14','0','27s', 'profile')">
<a href="user.php?id=14">Mike</a>"""
soup = bs4.BeautifulSoup(html) #Prepare the soup!
name = [i.string for i in soup.findAll('a') if 'user.php' in i['href']]
id = [i['href'].replace('user.php?id=','') for i in soup.findAll('a') if 'user.php' in i['href']]
dictionary = dict(zip(name,id))
print dictionary
输出:
{u'Mike': u'14'}
但是如果你需要正则表达式
试试这个:
name = re.findall('user.php\?id=\d+">(\w+)',string)
id =re.findall('user.php\?id=(\d+)',string)
dictionary = dict(zip(name,id))
print dictionary
输出:
{'Mike': '14'}
注意:要获取字典,只需将内置zip
函数与dict()
函数结合使用
答案 1 :(得分:2)
据我所知,问题是将名称与找到的ID对齐。您是否尝试使用一个正则表达式来查找名称和ID的对?
src = """
<a href="user.php?id=14">Mike</a>
<a href="user.php?id=11">Foo</a>
<a href="user.php?id=13">Bar</a>
"""
import re
pairs = re.findall(r'href="user.php\?id=(\d+)">(\w+)</a>', src)
print pairs
输出:[('14', 'Mike'), ('11', 'Foo'), ('13', 'Bar')]
您可能想要调整表达式以允许包含空格等的名称,但一般的想法应该有效。
您还可以轻松地创建字典(将ID映射到名称),dict(pairs)
将为您提供{'11': 'Foo', '13': 'Bar', '14': 'Mike'}