Hayır, BeautifulSoup tek başına XPath ifadelerini desteklemez.
Alternatif bir kütüphane, Lxml , yaptığı destek XPath 1.0. Bu bir var BeautifulSoup uyumlu modu o deneyeceğim ve HTML Çorbası yaptığı şekilde kırılmış ayrıştırmak. Ancak, varsayılan lxml HTML ayrıştırıcısı , bozuk HTML'yi ayrıştırmak kadar başarılıdır ve bence daha hızlıdır.
Belgenizi bir lxml ağacına ayrıştırdıktan sonra, .xpath()
öğeleri aramak için yöntemi kullanabilirsiniz .
try:
# Python 2
from urllib2 import urlopen
except ImportError:
from urllib.request import urlopen
from lxml import etree
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = urlopen(url)
htmlparser = etree.HTMLParser()
tree = etree.parse(response, htmlparser)
tree.xpath(xpathselector)
Ek işlevselliğe sahip özel bir lxml.html()
modül de vardır .
Yukarıdaki örnekte , ayrıştırıcının doğrudan akıştan okunmasını sağlamak, önce yanıtı büyük bir dizge halinde okumaktan daha verimli olduğundan , response
nesneyi doğrudan ilettiğime dikkat edin lxml
. requests
Kütüphane ile aynı şeyi yapmak için , şeffaf aktarım açmayı etkinleştirdikten sonra nesneyi ayarlamak stream=True
ve aktarmak istiyorsunuz :response.raw
import lxml.html
import requests
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = requests.get(url, stream=True)
response.raw.decode_content = True
tree = lxml.html.parse(response.raw)
İlginizi çekebilecek olası şey CSS Seçici desteğidir ; CSSSelector
sınıf için arama yaparak, XPath ifadeleri içine CSS ifadeleri çevirir td.empformbody
çok daha kolay:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Tam daire geliyor: BeautifulSoup kendisi vermez çok tam sahip CSS seçici destek :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.