python 在网站中插入文本并抓取生成的请求

rjzwgtxy  于 2022-12-21  发布在  Python
关注(0)|答案(3)|浏览(169)

我会尽可能详细地解释我的问题。我甚至不知道正确的术语。因此,我无法准确地搜索我的问题。我想使用这个website来计算一个句子的音节数,并使用Python的和库将每个句子生成的音节数刮到一个.txt文件中。下面是我想一步一步地做的事情:
1-打开此URL:https://www.howmanysyllables.com/syllable_counter/
2-在音节计数器字段中输入一些句子。
3-单击字段下的“计数音节”按钮。
4-将生成的数字刮到左边。
我可以通过从网站上刮取数字来完成第4步。我的挣扎在于第2步和第3步。我能够使用定义的函数来计算代码中的音节,但结果与网站中的不匹配。
我希望我已经尽可能清楚地解释了这个问题。

hkmswyz6

hkmswyz61#

此脚本将sentence作为POST请求中的参数发送到页面,并以文本形式获取结果:

import requests
from bs4 import BeautifulSoup

sentence = 'I will try to explain my problem as detailed as possible.'

url = 'https://www.howmanysyllables.com/syllable_counter/'
soup = BeautifulSoup( requests.get(url).content, 'html.parser' )

payload = {}
for i in soup.select('form[action="/syllable_counter/"] input[value]'):
    payload[i['name']] = i['value']
payload['UQ_txt'] = sentence

soup = BeautifulSoup( requests.post(url, data=payload).text, 'html.parser' )
for a in soup.select('#foot_M .Answer_Red'):
    print('{}{}'.format(a.text, a.find_next_sibling(text=True)))

图纸:

11 words
16 syllables
57 characters

EDIT:要发送多行,您可以使用以下示例:

import requests
from bs4 import BeautifulSoup

sentences = [
    'This is line one.'
    'This is line two.'
    'This is line three.'
]

url = 'https://www.howmanysyllables.com/syllable_counter/'
soup = BeautifulSoup( requests.get(url).content, 'html.parser' )

payload = {}
for i in soup.select('form[action="/syllable_counter/"] input[value]'):
    payload[i['name']] = i['value']
payload['UQ_txt'] = '\n'.join(sentences)

soup = BeautifulSoup( requests.post(url, data=payload).text, 'html.parser' )
for a in soup.select('#foot_M .Answer_Red'):
    print('{}{}'.format(a.text, a.find_next_sibling(text=True)))

图纸:

12 words
12 syllables
53 characters
dkqlctbz

dkqlctbz2#

此处以Selenium为例。
可能需要驱动程序来控制Web浏览器FirefoxChrome
代码中的注解中描述的每一行代码。

from selenium import webdriver
  
url = 'https://www.howmanysyllables.com/syllable_counter/'

# open browser
driver = webdriver.Firefox()

# load page
driver.get(url)

# find field 
item = driver.find_element_by_id('syl_input')

# put text
item.send_keys('Hello World')

# find button 
item = driver.find_element_by_id('button_submit')

# click button
item.click()

# find all red numbers 
all_answers = driver.find_elements_by_class_name('Answer_Red')
#for answer in all_answers:
#    print(answer.text)

# display numbers
print('words:', all_answers[0].text)
print('syllables:', all_answers[1].text)
print('characters:', all_answers[2].text)

**顺便说一句:**有时用Selenium编写会更容易,但用requests编写的版本(在其他答案中)应该工作得更快。

cyvaqqii

cyvaqqii3#

这非常简单!你可以使用强大且易于使用的python库"selenium“来与python中的网页交互。

**1-安装库:**要安装工具,您只需打开Windows命令提示符并键入:

pip install selenium
pip instal chromedriver-py==[your Chrome version]

例如,如果您的chrome版本是108.0.5359.125,您只需要键入以下内容(您可以从以下Chrome访问您的chrome版本:设置-〉关于):

pip install chromedriver-py==108.*

就是这样!

2-通过python打开chrome窗口

然后,打开一个新的代码并键入:

from selenium import webdriver
from chromewebdriver_py import binary_path
from time import sleep
 
driver = webdriver.Chrome(binary_path)
driver.maximize()

这段代码打开了一个chrome窗口并最大化了它!请注意键入“Chrome”的首字母大写。如果你对此感到困惑,这是完全自然的!你只需要在训练的第一天复制你的代码的第一行!

3-将浏览器导航到所需的URL!

URL = "https://www.howmanysyllables.com/syllable_counter/"
driver.get(URL)

轰!你可以享受你的驱动程序自动去你想要的链接!

4-在网页中查找所需元素的地址

这很简单,但有时也很棘手!正如你所知,网页中的每个元素都可以通过其地址访问。有几种方法来访问元素,但最有名的是CSS选择器。这并不难,你可以通过谷歌来学习,但chrome使它更容易!你只需要右键单击页面上你想要的元素,然后单击“检查”。例如,在您的问题中,如果您在文本框中执行此操作,则会出现以下窗口(在右侧):

然后你需要在这个新窗口中右键点击元素,然后复制-〉复制选择器,如下所示。然后你就得到了你想要的!

5-与元素交互这里,我们有从chrome复制的元素路径。这里我们需要在python中找到这个元素,然后与它交互!为此:

path = "Enter the CSS selector that you copied"
elem = driver.find_element('css selector', path)

elem.clear() # to clear the text box
elem.send_keys("Your desired number")

你做到了!享受Python自动输入数字的乐趣吧!注意用小写字母精确地输入“css selector”,以免出错!:-)

6-单击按钮这与上一节相同!您只需要通过右键单击复制此按钮的选择器(“按音节计数”按钮),然后:

path = "Enter the CSS selector that you copied"
elem = driver.find_element('css selector', path)
elem.click()
sleep(0.5) # waiting a little time to ensure that the calculation has been completed

7-从输出文本框中提取结果这也非常类似于上一步!但在这里,您有三个结果(单词,音节和字符)。如果我们右键单击此输出框,我们将看到:

如您所见,如果我们在此检查窗口中移动鼠标,我们将看到所需的元素是“span”元素!:

如果我们复制selector其中一个'span'元素,复制的CSS选择器将是:

#foot_M > span:nth-child(1)

非常漂亮!':nth-child(1)'表示第一个匹配这个CSS选择器的元素,所以如果我们删除这个部分如下:

#foot_M > span

我们会有一个CSS选择器匹配所有的'跨度'!我们可以检查这个地址在Chrome浏览器!在'inspect'窗口,按(Ctrl +f),然后复制这个CSS选择器如下!Chrome浏览器将显示您所有的元素匹配这个地址!x1c4d 1x
注意chrome已经找到了3个匹配这个地址的条目。太棒了!通过这个方法,你可以在chrome中检查你的CSS选择器,而不必在python中检查它,这会消耗更多的时间和精力!我通过实验发现了这个方法!我希望有人早点告诉我!
这样,我们就有了所需的全部内容,但在这里,我们需要键入driver.find_elements的复数形式来查找所有元素!

path = "#foot_M > span"
elems = driver.find_elements('css selector', path)
for elem in elems:
    print(elem.text)

恭喜你!你成功了!最后一步是把这段代码放进一个“for”循环中,然后坐下来喝茶,而python为你做这些重复的工作!

相关问题