我一直在尝试制作一个简单的Python网络爬虫,我正在使用正则表达式来查找相关链接。我正在尝试的网站是一个维基,我想只找到其URL以/ wiki /开头的链接。我也可以将其扩展到网站的其他部分,因此我要求我的代码尽可能动态。
我正在使用的当前正则表达式是
<a\s+href=[\'"]\/wiki\/(.*?)[\'"].*?>
但是,它找到的匹配项不包含/ wiki /。我不知道正则表达式的这个属性。理想情况下,因为我可以将其扩展到站点的其他部分(例如/ bio /),我希望正则表达式返回“/ wiki / [rest_of_url]”而不是简单地“/ [rest_of_url”。正则表达式
<a\s+href=[\'|"]\/(.*?)[\'"].*?>
工作正常(它找到以/开头的URL),因为它返回“/ wiki / [rest_of_url]”,但它不能确保/ wiki出现在文本中。
我该怎么做?
谢谢,
丹尼尔莫尼兹答案 0 :(得分:2)
展开括号,使它们包含正则表达式的/wiki/
部分
<a\s+href=[\'"](\/wiki\/.*?)[\'"].*?>
修改强>
在 re 中,括号允许您将搜索结果分解为多个部分。您告诉 re 解析器找到整个表达式,但只返回括号中的部分。您还可以使用多组括号:
<a\s+href=[\'"](\/wiki\/)(.*?)[\'"].*?>
在这种情况下,MatchObject.group()
将返回整个匹配的对象。但是,如果你调用MatchObject.groups()
,它将返回一个包含/wiki/
的元组,以及与第二个括号内容匹配的元组。查看regex syntax上的python.org文档。
答案 1 :(得分:1)
您可以使用HTML解析器,例如lxml
:
from lxml import html
for element, attribute, link, pos in html.iterlinks(html_string):
if attribute == 'href' and link.startswith('/wiki'):
print(link)
或使用BeautifulSoup
:
import re
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_string)
for a in soup.findAll('a', href=re.compile(r'^/wiki')):
print(a['href'])