我使用bs4来提取带有js流项类的li标记,但不包含以下滚动凸点用户卡。(只得到a,b)
<li class="js-stream-item stream-item ">a<li>
<li class="js-stream-item stream-item stream-item ">b<li>
<li class="js-stream-item stream-item scroll-bump-user-card ">c<li>
我在想两种方法。
soup.find_all('li', class_=re.compile('js-stream-item'))
获取所有标签,然后用滚动凸起式用户卡删除标签。[tag.extract() for tag in soup.find_all('li', class_=re.compile('scroll-bump-user-card'))]
删除,然后再查找所有内容。问题是,如果通过编辑re.compile()
中的正则表达式(而不是语法)来获得a,b的话,是否有一个不错的方法。
Update I将alecxe的答案的第一个选项重写为一行,如下所示:
soup.find_all(lambda tag: re.compile('js-stream-item').search(str(tag))
and not re.compile('scroll-bump-user-card').search(str(tag))
and tag.name == 'li')
发布于 2016-07-21 01:51:27
一种选择是使用搜索函数并检查是否存在js-stream-item
类和没有scroll-bump-user-card
类:
def search_function(tag):
if tag.name == "li":
class_ = tag.get("class", [])
return "js-stream-item" in class_ and "scroll-bump-user-card" not in class_
for li in soup.find_all(search_function):
print(li.get_text(strip=True))
另一种选择是查找所有li
和js-stream-item
类,并跳过具有scroll-bump-user-card
类的li
元素:
for li in soup.select("li.js-stream-item"):
if "scroll-bump-user-card" in li["class"]:
continue
print(li.get_text(strip=True))
另一种方法是检查class
是否以stream-item
结尾,并使用CSS选择器 (不要使用这个):
for li in soup.select("li[class$=' stream-item ']"):
print(li.get_text(strip=True))
请注意,用于此用例的一个更好的CSS选择器是:
li.js-stream-item:not(.scroll-bump-user-card)
但是,由于BeautifulSoup
中对CSS选择器的支持有限,它将无法工作。
https://stackoverflow.com/questions/38493154
复制相似问题