当我点击该按钮时,我正在尝试抓取一个具有指向另一个网站链接的网站。我想知道那个网站的名字。
文档包含:
<a class = "classA" onclick = "vendors_viewWebsite('http://www.somewebsite.com', '5454')" rel="nofollow" role="button"> Visit Website </a>
我想找到<a>
所在的onclick值,然后检查其中是否有“ http:” 并返回网站的URL。
有没有办法找到那个?
答案 0 :(得分:0)
您可以使用下面的xpath。
//a[contains(@onclick,'http')]
脚本:
# get the link with `http` in it's onclick attribute value
urlLink = driver.find_element_by_xpath("//a[contains(@onclick,'http')]")
print(urlLink.get_attribute("onclick"))
如果页面上有多个具有onclick
值的链接,则可以使用
urlElems = driver.find_elements_by_xpath("//a[contains(@onclick,'http')]")
For urlElem in urlElems:
print(urlElem.get_attribute("onclick"))
答案 1 :(得分:0)
假设您的HTML位于名为soup
的变量中,则可以使用soup.find_all(name, attrs, recursive, string, limit, **kwargs)。任何未提及的关键字参数都将被解释为属性(因此,在您的情况下为onclick
),但是我们仍然需要找到可接受的值范围以提供。
要仅在结果上带有“ http://”或“ https://”的情况下返回结果,我们将需要创建一个正则表达式。此正则表达式为r"['\"](http(?:s?)://[^'\"]+)"
。您可以查看说明here。我假设URL不包含'
或"
字符,并且其中任何一个字符都出现在URL之前和之后。
然后,我们所需要做的就是应用re.compile(pattern)函数,我们得到:
pattern = re.compile(r"['\"](http(?:s?)://[^'\"]+)"))
# Retrieve all elements containing the onclick attribute as desired
a_matches = soup.find_all("a", onclick=re.compile(r"['\"](http(?:s?)://[^'\"]+)"))
# Get just the URLs from the retrieved elements, by re-applying our regex
urls = [re.search(pattern, a["onclick"]).group(1) for a in a_matches]
re.search(pattern, string) documentation。上面的代码中的group(1)
意味着我们仅在正则表达式中检索第一个捕获组,它是(http(?:s?)://[^'\"]+)
的一部分。
答案 2 :(得分:0)
您可以将BeautifulSoup与CSS选择器a[onclick*="http"]
一起使用(选择所有<a>
,其onclick
属性包含http
)
from bs4 import BeautifulSoup
data = '''
<a class = "classA" onclick = "vendors_viewWebsite('http://www.somewebsite.com', '5454')" rel="nofollow" role="button"> Visit Website </a>
'''
soup = BeautifulSoup(data, 'html.parser')
for a in soup.select('a[onclick*="http"]'):
print(a['onclick'])
打印:
vendors_viewWebsite('http://www.somewebsite.com', '5454')
进一步阅读:
答案 3 :(得分:0)
您可以结合使用attribute = value css选择器来定位onclick
并声明onclick
必须包含 (*)http:
并且以字符串vendors_viewWebsite
。希望这更具选择性。为if None
添加一个测试。分割出最终的网址。对于多个比赛,请使用select
,因为select_one
仅返回第一个比赛。
from bs4 import BeautifulSoup as bs
html = '''
<a class = "classA" onclick = "vendors_viewWebsite('http://www.somewebsite.com', '5454')" rel="nofollow" role="button"> Visit Website </a>
'''
soup = bs(html, 'lxml')
element = soup.select_one('[onclick^=vendors_viewWebsite][onclick*=http\:]')
if element is None:
link = 'Not found'
else:
link = element['onclick'].split("'")[1]
从运算符开始
[attr ^ = value]
表示属性名称为attr的元素,其值为 值(在值之前)。
包含运算符
[attr * = value]
表示属性名称为attr的元素,其值 在字符串中至少包含一个值。