所以我想获得这个html代码中的链接,我尝试使用正则表达式
<div class="title" onclick="ta.setEvtCookie('Search_Results_Page', 'POI_Name', '', 0, '/Attraction_Review-g1787072-d2242305-Reviews-Lake_Travis_Zipline_Adventures-Volente_Texas.html')"><span>Lake Travis <span class="highlighted">Zipline</span> Adventures</span></div>
到目前为止,我已经完成了这项工作,但直到最后部分
才开始/ Attraction_Review- \ W + - \ W + - \ W +
它只捕获
/ Attraction_Review-g1787072-d2242305-评价
我怎样才能让它抓到.html部分?
我希望它能抓住整个链接
此外,链接是动态生成的,因此没有任何固定长度
答案 0 :(得分:3)
如何替代正则表达式方法:使用 HTML解析器获取onclick
属性值并使用 Javascript解析器来提取最后一个函数参数。
我在这里使用BeautifulSoup
和slimit
解析器:
from bs4 import BeautifulSoup
from slimit import ast
from slimit.parser import Parser
from slimit.visitors import nodevisitor
data = """<div class="title" onclick="ta.setEvtCookie('Search_Results_Page', 'POI_Name', '', 0, '/Attraction_Review-g1787072-d2242305-Reviews-Lake_Travis_Zipline_Adventures-Volente_Texas.html')"><span>Lake Travis <span class="highlighted">Zipline</span> Adventures</span></div>"""
soup = BeautifulSoup(data)
# get onclick value
onclick = soup.find("div", class_="title", onclick=True)["onclick"]
# parse onclick js code
parser = Parser()
tree = parser.parse(onclick)
for node in nodevisitor.visit(tree):
if isinstance(node, ast.FunctionCall):
print(node.args[-1].value)
打印:
'/Attraction_Review-g1787072-d2242305-Reviews-Lake_Travis_Zipline_Adventures-Volente_Texas.html'
我知道使用Javascript解析器来获得这么简单直接的Javascript代码可能有点太多了 - 随意用正则表达式替换那部分。但是,请确保使用HTML解析器解析HTML本身。