是否可以在BeautifulSoup4中遍历HTML树?

时间:2019-03-09 17:41:21

标签: python html beautifulsoup

示例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解析器会更容易?

1 个答案:

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