BeautifulSoup не может очистить <g>внутри - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь очистить текст y6 внутри <g class="jbfraglines">, но получаю пустой список из select и find_all.

HTML (упрощенно)

<form method="GET" enctype="application/x-www-form-urlencoded" action="peptide_view.pl">
  <div id="xi:container">
    <svg id="xi:svg-container" xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" width="800" height="400" style="width: 800px; height: 400px; background: white; border: 1px solid black; overflow: hidden; cursor: default;">
      <defs><filter x="0" y="0" width="100%" height="100%" id="opaqueBackground"><feFlood flood-color="#ffffff" flood-opacity="1" result="bg"></feFlood><feMerge><feMergeNode in="bg"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter></defs>
      <g class="view-label"><text text-anchor="start" x="742" y="352" transform="rotate(0)" id="id1" style="undefined" class="label">observed</text></g>
      <g class="jbresidue"></g><g class="jbresidue"><text text-anchor="middle" x="35" y="60" dx="0" dy="0" transform="rotate(0 35,60)" id="id19" class="aa">A</text></g>
      <g class="jbresidue"><text text-anchor="middle" x="55" y="60" dx="0" dy="0" transform="rotate(0 55,60)" id="id20" class="aa">A</text></g>
      <g class="jbfraglines"><line x1="45" y1="67" x2="45" y2="37" id="id21" stroke="#000000" stroke-width="1"></line><line x1="45" y1="37" x2="55" y2="27" id="id22" stroke="#000000" stroke-width="1"></line><line x1="45" y1="67" x2="35" y2="77" id="id23" stroke="#999999" stroke-width="1" style="visibility: hidden;"></line>
        <text text-anchor="start" x="45" y="30" dx="0" dy="0" transform="rotate(-45 45,30)" id="id24" fill="#000000">y6</text>
        <text text-anchor="start" x="38" y="90" dx="0" dy="0" transform="rotate(-45 38,90)" id="id25" style="visibility: hidden;">b1</text></g>
…

Myкод

import requests
import urllib.request
import time
from bs4 import BeautifulSoup
...
print(soup.select('g[class="jbfraglines"]'))
>> []
print(soup.find_all('g[class="jbfraglines"]'))
>> []

Поскольку g находится в <div[id="xi:container"]> и <form method="GET" ...>, поэтому я попытался select их, но они также возвращали пустые списки или ошибки.

print(soup.find_all('div[id="xi:container"]'))
>> []
print(soup.select('div[id="xi:container"]'))
>> UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 114: illegal multibyte sequence
print(soup.select('form'))
>> UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 114: illegal multibyte sequence
print(soup.find_all('form'))
>> UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 114: illegal multibyte sequence

response = requests.get(link) вернул <Response [200]>, и я уверен, что смогу попасть на нужную страницу. Что здесь не так? Нужно ли что-то делать для очистки текста внутри form или svg?

Еще одна вещь, которую я заметил, - этот HTML имеет <script type="text/javascript" src="../templates/peptide_view.js?2.006001"></script>. Я не уверен, что проблема связана с js?.

...