2016-01-01 44 views
6

HTML wejściowe:czynienia z dwukropkiem w BeautifulSoup selektorów CSS

<div style="display: flex"> 
    <div class="half" style="font-size: 0.8em;width: 33%;"> apple </div> 
    <div class="half" style="font-size: 0.8em;text-align: center;width: 28%;"> peach </div> 
    <div class="half" style="font-size: 0.8em;text-align: right;width: 33%;" title="nofruit"> cucumber </div> 
</div> 

Pożądana moc: wszystkie div elementy dokładnie pod <div style="display: flex">.

Próbuję zlokalizować rodzica div z CSS selector:

div[style="display: flex"] 

ten zgłasza błąd:

>>> soup.select('div[style="display: flex"]') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/user/.virtualenvs/so/lib/python2.7/site-packages/bs4/element.py", line 1400, in select 
    'Only the following pseudo-classes are implemented: nth-of-type.') 
NotImplementedError: Only the following pseudo-classes are implemented: nth-of-type. 

to wygląda BeautifulSoup próbuje interpretować okrężnicy jako pseudo-klasie składnia.

starałem się przestrzegać rad sugerowane w Handling a colon in an element ID in a CSS selector, ale to wciąż wyrzuca błędy:

>>> soup.select('div[style="display\: flex"]') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/user/.virtualenvs/so/lib/python2.7/site-packages/bs4/element.py", line 1400, in select 
    'Only the following pseudo-classes are implemented: nth-of-type.') 
NotImplementedError: Only the following pseudo-classes are implemented: nth-of-type. 
>>> soup.select('div[style="display\3A flex"]') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/user/.virtualenvs/so/lib/python2.7/site-packages/bs4/element.py", line 1426, in select 
    'Unsupported or invalid CSS selector: "%s"' % token) 
ValueError: Unsupported or invalid CSS selector: "div[style="displayA" 

Pytanie:

Jaki jest prawidłowy sposób na wykorzystanie/ucieczki dwukropek wartości atrybutów w selektorach CSS BeautifulSoup?


Zauważ, że mogę obejść go z częściowym meczu atrybut:

soup.select("div[style$=flex]") 

Lub z find_all():

soup.find_all("div", style="display: flex") 

Należy również pamiętać, że rozumiem, że za pomocą style zlokalizować elementy nie jest dobrą techniką lokalizacji, ale samo pytanie ma być generyczne, a dostarczony kod HTML jest tylko przykładem.

+0

Zakładam, że wypróbowałeś również dwa ukośniki odwrotne? 'soup.select ('div [style =" display \\: flex "]')' –

+0

@JoshCrozier szczęśliwego nowego roku, yup i różnych kombinacji z surowymi ciągami i zwykłymi ciągami. Dzięki. Wciąż myśl, że po prostu brakuje mi czegoś. – alecxe

+2

... wat. Mów o zepsutym. – BoltClock

Odpowiedz

2

Aktualizacja: problem został już rozwiązany w BeautifulSoup 4.5.0, Upgrade jeśli potrzebne:

pip install --upgrade beautifulsoup4 

Old odpowiedź:

Utworzono problem w trackera BeautifulSoup problem:

zaktualizuje odpowiedź w przypadku wszelkich aktualizacji w wydaniu startera.

1

Nie jestem pewny, czy to stanowi odpowiedź dokładnie, ponieważ jest zdecydowanie zepsuta. Jednak, o dziwo, błąd jest wywoływany nie przez samą :, ale przez :, po której następuje spacja. Błąd sugeruje, że próbuje użyć tego, co jest po spacji jako selektora CSS.

Na przykład edycję HTML spadać przestrzeń sprawia, że ​​blok znowu do wyboru:

>>> from bs4 import BeautifulSoup 
>>> html = """ 
... <div style="display:flex"> 
...  <div class="half" style="font-size: 0.8em;width: 33%;"> apple </div> 
...  <div class="half" style="font-size: 0.8em;text-align: center;width: 28%;"> peach </div> 
...  <div class="half" style="font-size: 0.8em;text-align: right;width: 33%;" title="nofruit"> cucumber </div> 
... </div> 
... """ 

>>> soup = BeautifulSoup(html) 
>>> soup.select('div[style="display: flex"]') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python3.4/dist-packages/bs4/element.py", line 1313, in select 
    'Unsupported or invalid CSS selector: "%s"' % token) 
ValueError: Unsupported or invalid CSS selector: "flex"]" 

>>> soup.select('div[style="display:flex"]') 
[<div style="display:flex"> 
<div class="half" style="font-size: 0.8em;width: 33%;"> apple </div> 
<div class="half" style="font-size: 0.8em;text-align: center;width: 28%;"> peach </div> 
<div class="half" style="font-size: 0.8em;text-align: right;width: 33%;" title="nofruit"> cucumber </div> 
</div>] 

Niestety, ze przestrzeń jest zwykły styl więc to prawdopodobnie nie będzie Ci bardzo daleko w ogóle!

+0

Interesująca obserwacja! Dzięki. – alecxe