如何提取点​​击值

时间:2019-07-12 19:36:52

标签: python selenium beautifulsoup

当我点击该按钮时,我正在尝试抓取一个具有指向另一个网站链接的网站。我想知道那个网站的名字。

文档包含:

<a class = "classA" onclick = "vendors_viewWebsite('http://www.somewebsite.com', '5454')" rel="nofollow" role="button"> Visit Website </a>

我想找到<a>所在的onclick值,然后检查其中是否有“ http:” 并返回网站的URL。

有没有办法找到那个?

4 个答案:

答案 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')

进一步阅读:

CSS Selectors Reference

答案 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]

  1. 开发人员参考:css selectors

从运算符开始

  

[attr ^ = value]

     

表示属性名称为attr的元素,其值为   值(在值之前)。

包含运算符

  

[attr * = value]

     

表示属性名称为attr的元素,其值   在字符串中至少包含一个值。