我要解析的网页中同时存在
<p class="left title"><a href="xxxx">xxxx</a></p>
和
<p class="title"><a href="xxxx">xxxx</a></p>
如果用
soup.findAll('p', {'class': 'title'}):
会同时输出上面两个 class ,我现在只想要"title",应该怎么写?
1
assassinleo 2016-09-10 12:45:24 +08:00
试试这个看行不: soup.find_all(‘ p ’,class="title")或者 soup.find_all(‘ p ’,class=re.compile("title"))
ref: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all |
2
xucuncicero OP @assassinleo 无效,只是写法不一样,后一个有语法错误(应该写成 class_),还有其他写法结果也没什么区别。
这里的问题是 find_all 或者 findAll 的参数中只要能匹配到"title"就肯定能匹配到"left title",不知道有没有什么能排除某个字符串的写法。 |
3
caspartse 2016-09-10 16:19:17 +08:00 1
soup.select('p[class=title]')
|
4
xiahei 2016-09-10 16:23:10 +08:00 1
不一定就要用`find_all()`, `select()`也能用上。
|
5
7sDream 2016-09-10 16:26:24 +08:00 1
|
6
judyApple 2016-09-11 04:29:44 +08:00 1
加个 if 语句好像就可以。 itDic.attrs 返回一个字典,要字典的 value 长度为 1 就可以筛去 left
for itDic in soup.findAll("p",{"class":"title"}): if len(itDic.attrs['class'])==1: print(itDic.attrs) |
7
aihimmel 2016-09-11 10:32:11 +08:00 via Android
Xpath 大法好
|