示例HTML(Python代码段中的“ x.html”):
<table>
<tr>
<td>a</td>
<td>b</td>
<table><tr><td>c</td></tr></table>
</tr>
</table>
我想从表的单行中获取包含三列的列表:
[
'<td>a</td>',
'<td>b</td>',
'<table><tr><td>c</td></tr></table>'
]
我试图简单地遍历BeautifulSoup
对象,但是它返回了整个HTML和空(很好,'\n'
)字符串。
In [9]: soup = BeautifulSoup(open('x.html').read(), 'html.parser')
In [10]: for a in soup:
...: print(type(a))
...:
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
我也尝试使用find_all()
方法,但是它找到了我不想在结果中看到的嵌套<td>c</td>
:
In [24]: len(soup.find_all('td'))
Out[24]: 4 # <-- I need 3 things, not 4
我认为find / find_all参数recursive
与嵌套元素有关,但我不知道它是否有效:
Signature: soup.find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
In [26]: len(soup.find_all('td', recursive=False))
Out[26]: 0
也许编写xml.sax
解析器会更容易?
答案 0 :(得分:1)
正如@Danielle在评论中建议的那样,您可以获得外部func connect(for state: BluetoothState) -> Observable<Characteristic> {
return manager.observeState()
.startWith(state)
.filter { $0 == .poweredOn }
.flatMap { _ in self.manager.scanForPeripherals(withServices: [self.PERDIX_UUID]) }
.take(1)
.flatMap { $0.peripheral.establishConnection()
.flatMap { $0.discoverServices([self.PERDIX_UUID]) }.asObservable()
.flatMap { Observable.from($0) }
.flatMap { $0.discoverCharacteristics([self.PERDIX_CHAR_UUID])}.asObservable()
.flatMap { Observable.from($0) }
}
connect(for: state)
.subscribe(onNext: { characteristic in
print("Discovered characteristic: \(characteristic.characteristic.uuid)")
self.result.text = characteristic.characteristic.uuid.uuidString
characteristic.writeValue(data as Data, type: .withResponse)
.subscribe { event in
//respond to errors / successful read
}
})
的{{1}}。但是,由于您正在从该文件中读取内容,因此您将获得许多.contents
和其他不需要的元素。您可以检查tr
是否仅获取标签内容。
在某些情况下,使用不正确的html可能不会有像这样的简单解决方案。在这种情况下,您还可以将自定义函数传递给"\n"
。例如您正在寻找的数据也可以通过这种逻辑获得-在文件的第一张表中找到所有isinstance(x,Tag)
和find_all
标签。当然,逻辑可能与此不同,但是您明白了。
td