欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

提取節點的XPATH或CSS路徑

錢衛國1年前8瀏覽0評論

我想從html中提取一些數據,然后能夠在客戶端突出顯示提取的元素,而無需修改源HTML。XPath或CSS P ath看起來很適合這個。有可能直接從BeautifulSoup中提取XPATH或CSS路徑嗎? 現在我使用標記目標元素,然后使用lxml lib來提取xpath,這對性能非常不利。我知道bsx path . py——它不能與BS4一起工作。 由于復雜性,重寫一切以使用原生lxml庫的解決方案是不可接受的。

import bs4
import cStringIO
import random
from lxml import etree


def get_xpath(soup, element):
  _id = random.getrandbits(32)
  for e in soup():
    if e == element:
      e['data-xpath'] = _id
      break
  else:
    raise LookupError('Cannot find {} in {}'.format(element, soup))
  content = unicode(soup)
  doc = etree.parse(cStringIO.StringIO(content), etree.HTMLParser())
  element = doc.xpath('//*[@data-xpath="{}"]'.format(_id))
  assert len(element) == 1
  element = element[0]
  xpath = doc.getpath(element)
  return xpath

soup = bs4.BeautifulSoup('<div id=i>hello, <b id=i test=t>world!</b></div>')
xpath = get_xpath(soup, soup.div.b)
assert '//html/bodydiv/b' == xpath

提取簡單的CSS/XPath其實很容易。這和lxml lib給你的一樣。

def get_element(node):
  # for XPATH we have to count only for nodes with same type!
  length = len(list(node.previous_siblings)) + 1
  if (length) > 1:
    return '%s:nth-child(%s)' % (node.name, length)
  else:
    return node.name

def get_css_path(node):
  path = [get_element(node)]
  for parent in node.parents:
    if parent.name == 'body':
      break
    path.insert(0, get_element(parent))
  return ' > '.join(path)

soup = bs4.BeautifulSoup('<div></div><div><strong><i>bla</i></strong></div>')
assert get_css_path(soup.i) == 'div:nth-child(2) > strong > i'

恐怕圖書館還做不到這一點。你可以通過css路徑獲取它們...有幾分...但是,這有點復雜,在這里您命名每個元素和類,例如:

soup.find("htmlelement", class_="theclass")

如果您希望更具體地說明您所獲取的內容,您也可以使用id而不是類,或者兩者都使用。

你可以修改它,繼續沿著這條路走下去:

soup.find("htmlelement", class_="theclass").find("htmlelement2", class_="theclass2")

如此等等。

還可以通過調用內置的“下一個”函數來導航:

find_next("td", class_="main").find_next("td", class_="main").next.next