Các Câu hỏi:Mở rộng selectors CSS trong BeautifulSoup
BeautifulSoup
cung cấp một hỗ trợ rất hạn chế cho CSS selectors. Ví dụ: lớp giả được hỗ trợ duy nhất là nth-of-type
và chỉ có thể chấp nhận các giá trị số - các đối số như even
hoặc odd
không được phép.
Có thể mở rộng BeautifulSoup
bộ chọn CSS hoặc để nó sử dụng lxml.cssselect
nội bộ dưới dạng cơ chế chọn CSS cơ bản không?
Chúng ta hãy nhìn vào một dụ trường hợp vấn đề/sử dụng. Xác định vị trí chỉ thậm chí hàng trong HTML sau:
<table>
<tr>
<td>1</td>
<tr>
<td>2</td>
</tr>
<tr>
<td>3</td>
</tr>
<tr>
<td>4</td>
</tr>
</table>
Trong lxml.html
và lxml.cssselect
, nó rất dễ dàng để làm qua :nth-of-type(even)
:
from lxml.html import fromstring
from lxml.cssselect import CSSSelector
tree = fromstring(data)
sel = CSSSelector('tr:nth-of-type(even)')
print [e.text_content().strip() for e in sel(tree)]
Nhưng, trong BeautifulSoup
:
print(soup.select("tr:nth-of-type(even)"))
sẽ ném một lỗi:
NotImplementedError: Only numeric values are currently supported for the nth-of-type pseudo-class.
Lưu ý rằng chúng ta có thể workaround nó với .find_all()
:
print([row.get_text(strip=True) for index, row in enumerate(soup.find_all("tr"), start=1) if index % 2 == 0])
Cảm ơn vì sự mạnh mẽ 'Tôi không hình dung điều này đang được sử dụng nghiêm túc ở bất cứ đâu, bao giờ hết.'! :) – alecxe