使用BeautifulSoup,我想只在其href字符串中返回包含“Company”而不是“Sector”的“a”标签。有没有办法在re.compile()中使用正则表达式只返回公司而不是部门?
代码:
soup = soup.findAll('tr')[5].findAll('a')
print(soup)
输出
[<a class="example" href="../ref/index.htm">Example</a>,
<a href="?Company=FB">Facebook</a>,
<a href="?Company=XOM">Exxon</a>,
<a href="?Sector=5">Technology</a>,
<a href="?Sector=3">Oil & Gas</a>]
使用此方法:
import re
soup.findAll('a', re.compile("Company"))
返回:
AttributeError: 'ResultSet' object has no attribute 'findAll'
但我希望它返回(没有Sectors):
[<a href="?Company=FB">Facebook</a>,
<a href="?Company=XOM">Exxon</a>]
使用:
答案 0 :(得分:2)
使用soup = soup.findAll('tr')[5].findAll('a')
然后soup.findAll('a', re.compile("Company"))
写入原始汤变量。 findAll
返回一个ResultSet,它基本上是一个BeautifulSoup对象的数组。请尝试使用以下内容来获取所有“公司”链接。
links = soup.findAll('tr')[5].findAll('a', href=re.compile("Company"))
要获取这些标记中包含的文字:
companies = [link.text for link in links]
答案 1 :(得分:2)
另一种方法是xpath,它支持AND / NOT操作,以便按XML文档中的属性进行查询。不幸的是,BeautifulSoup本身并不处理xpath,但lxml可以:
from lxml.html import fromstring
import requests
r = requests.get("YourUrl")
tree = fromstring(r.text)
#get elements with company in the URL but excludes ones with Sector
a_tags = tree.xpath("//a[contains(@href,'?Company') and not(contains(@href, 'Sector'))]")
答案 2 :(得分:1)
您可以使用 css选择器获取href以for url in re.findall(r'"(http[^"]+).*360p"', elt.text):
print(url)
开头的所有标记:
?Company
如果您只想从第六个tr中获得它们,您可以使用 nth-of-type :
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
a = soup.select("a[href^=?Company]")
答案 3 :(得分:1)
感谢上述答案@Padriac Cunningham和@Wyatt I !!这是我提出的不太优雅的解决方案:
import re
for i in range(1, len(soup)):
if re.search("Company" , str(soup[i])):
print(soup[i])